避免角括号的antlr语法
在 .提供的解决方案效果很好,但是我想处理一个边缘案例.要回顾一下,我正在解析任意用户输入的文本,并希望出现符合有效的标签语法.如果角度括号不是有效标签的一部分,则应将其逃脱为<或>.我要寻找的语法是其中foo是从固定条目列表中的文本,123是数字[0-9]+.解析器: parser grammar TagsParser; options { tokenVocab = TagsLexer; } parse: (tag | text)* EOF; tag: LANGLE fixedlist GRIDLET ID RANGLE; text: NOANGLE; fixedlist: FOO | BAR | BAZ; lexer: lexer grammar TagsLexer; LANGLE: ' pushMode(tag); NOANGLE: ~[]+; mode tag: RANGLE: '>' -> po
12 2024-04-26
编程技术问答社区
在ANTLR中解析C# lambda函数
用antlr解析c#lambda表达式的语法是什么? 我试图提出一个可以通过即时作业的单线Lambda表达方式成功解析的. Action actionSingleLine = () => Console.WriteLine("Non-returning lambda"); 到目前为止,我有这样的东西: grammar Lambda; input: line EOF; line: type name equals lbrackets LAMBDASIGN body ';'; type: ACTION; name: FUNCNAME; equals: EQ; lbrackets: BRACKETS; body: TEXT; fragment A : 'A'; fragment C : 'c'; fragment T : 't'; fragment I : 'i'; fragment O : 'o'; fragment N : 'n'; fragment LPAR: '(';
22 2024-04-26
编程技术问答社区
Return 语句不进行评估,Expression 只评估其下的规则
美好的一天,我正在基于Antlr4的解释器上工作,我正在将功能功能添加到该语言中,而无需返回语句函数工作,但返回语句不起作用,或者我可以说返回语句不起作用,因为返回语句返回Invalid Expression . 这是我完整的语法和访客类实现. DECLARE : 'declare'; SET : 'set'; TO : 'to'; SHOW : 'show'; SHOWLINE : 'showline'; REPEAT : 'repeat'; WHILE : 'while'; TIMES : 'times'; END_REPEAT : 'end repeat'; IF : 'if'; THEN : 'then'; ELSE : 'else'; ELSE_IF :
20 2024-04-26
编程技术问答社区
为什么ANTLR生成的解析器会重复使用上下文对象?
我正在尝试使用ANTLR为简单的编程语言创建解释器. 我想添加递归的功能. 到目前为止,我已经实现了定义和调用功能,并选择使用多个返回语句和本地变量.为了实现局部变量,我将FunctionCallContext的解析器部分类别扩展到了它们的字典.我可以成功使用它们.另外,当我(递归)再次调用相同的函数时,解析器会为新功能调用创建一个新的上下文对象,如我所期望的那样. 但是,如果我创建一个"更深"的递归,则函数调用的第三个上下文将与第二个相同(具有相同的哈希代码和相同的本地变量). 我的(更新)语法: grammar BatshG; /* * Parser Rules */ compileUnit: ( (statement) | functionDef)+; statement: print ';' | println ';' | assignment ';' |
14 2024-04-24
编程技术问答社区
如果在循环ID字符串名称中语句,而不是基于ANTL4的解释器中的值
如果有人会有所帮助,那么美好的一天真的可以感激.我正在基于Antlr4的解释器上工作,现在我在实施访客课程后面临挑战.该实现正在完美工作,即if语句,除非内部循环,否则它将返回ID名称而不是值. 以下是实现 using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EasyBite { public class Interpreter : EasyBiteBaseVisitor { private Dictionary variables = new Dictionary(); // Helper function to convert an object to a bool
24 2024-04-24
编程技术问答社区
如何在ANTLR v3生成的解析器或词法器上指定访问指定器?
使用antlr v3和csharp2语言规范符,是否有任何方法表明您希望生成的lexer或解析器是内部的,而不是公共的默认值? 指定名称空间: @lexer::namespace {My.Namespace} 我认为访问说明符存在类似的东西,但是我找不到它. 解决方案 this 其他解决方案 我想知道同样的事情,从查看它使用的模板,它看起来不可能. "公共"是硬编码的.
22 2024-04-24
编程技术问答社区
如何解决简单的歧义问题
我刚刚开始使用Antlr并陷入困境.我有以下语法,并试图解决歧义,以解析诸如Field:valuestring之类的分析. expression : Field ':' ValueString; Field : Letter LetterOrDigit*; ValueString : ~[:]; Letter : [a-zA-Z]; LetterOrDigit : [a-zA-Z0-9]; WS: [ \t\r\n\u000C]+ -> skip; 假设A:B传递到语法,A和B都被识别为字段.我如何在antlr4(c#)中解决这个问题? 解决方案 您可以在Lexer规则中使用语义谓词执行lookahead(或后面)而无需消耗字符( antlr4负Lookahead在lexer中) 在您的情况下,要删除歧义,您可以检查Field规则之后的字符是否为:,也可以检查ValueString之前的char是否是:. 第一种情况: expression : Fie
20 2024-04-23
编程技术问答社区
集成到VS2008时,antlr c#出错
我正在关注该教程:当我进入步骤11时,使用VS编译,我将得到以下内容: 错误的类型或命名空间名称" Astparserrulereturnscope"找不到 错误的类型或名称名称" grammarrule"找不到 错误的类型或名称名称" GrammarruLeatTribute"找不到 等. 任何人的提示?在这里几乎没有任何文档可以帮助我. 谢谢! 解决方案 如果您使用编译的运行时DLL,请使用antlrworks 1.4生成代码.否则,如果您使用最新版本的Antlrworks,我相信您需要获取最新版本的运行时间并进行编译. 其他解决方案 您很可能只需要一个近最新版本的Antlr .NET运行时.最新版本可以在以下网址找到:/antlr3/antlr3csharprealease ANTLR版本3.4.1一直在使用Antlrworks 1.4.3解析器和Lexers为我工作;在升级运行时,我遇到了与您相同的错误.
14 2024-04-23
编程技术问答社区
使用ANTLR4解析并返回一个双数的列表
如何使用antlr4在c#中将包含小数号的文件解析为List?一个完整的,有效的示例将说明所有碎片如何一起进行. 输入文件看起来像这样: 12.34 45.67 89.10 解决方案 这是一个对不同问题的较旧答案的更新版本,显示了使用C#和Antlr4执行此任务的一种方法. 语法 grammar Values; parse : (number ( LINEBREAK | EOF ) )* ; number : NUMBER ; NUMBER : DIGIT '.' DIGIT ; DIGIT : [0-9]+ ; WS : [ \t] -> channel(HIDDEN) ; LINEBREAK : '\r'? '\n' | '\r' ; 听众 现在是实现侦听器模式的类,现在在 number 上听 using System; using System.Collections.Generic; namespace ANTLR_Fi
18 2024-04-22
编程技术问答社区
解析SQL查询并拉出列名和表名
我有这样的查询脚本: SELECT View1.OrderDate,View1.Email,SUM(View1.TotalPayments) FROM dbo.View1 WHERE (View1.OrderStatus = 'Completed') GROUP BY View1.OrderDate,View1.Email HAVING (SUM(View1.TotalPayments) > 75); 是否有任何方法可以从SQL查询中提取一些关键信息?例如表名和列名,我有2个问题: 我确实搜索了一些解析器,例如Antlr,但我无法 查找用C#语言解释此解析器的文档. 有什么方法可以使用实体框架工作来解析SQL查询?我的查询是完全动态的,它们是在运行时创建的 解决方案 我认为最好的答案是使用讽刺的解析器: http://irony.codeplex.com/ 汉塞尔曼(Hanselman)有一个很好的链接,如何使用它来解析SQL: x 我希望这会有所
20 2024-04-21
编程技术问答社区
如何用ANTLR获得C#的词典和解析器?
似乎Antlr支持C#语言,但我不知道如何生成相关类. 我搜索并看到了Visual Studio的扩展,但我不支持2015 那么,我如何用antlr手动为C#生成Lexer和解析器? 解决方案 无需与Visual Studio集成. 在此处下载jar文件: http://www.antlr. org/download/antlr-runtime-4.5.1.jar 将其保存到C:\Test 将罐子添加到您的类路径: 使用系统属性对话框>环境变量>创建或附加到类Pather变量 在变量中,put C:\Test\antlr-runtime-4.5.1.jar如果该变量已经存在值,请在新条目之前插入a ; 在您的语法文件中复制C:\ test 转到命令行,导航到C:\ test 创建您的'outputDirectory'文件夹,然后运行此(请记住替换{outputDirectory}和{input}: java org.a
12 2024-04-21
编程技术问答社区
Antlr错误策略,跳过标记直到规则再次匹配
我尝试了一个>解决方案,但似乎对我不起作用 这是我的语法机构的摘录: module : BEGIN MODULE IDENT STRING module_element* END MODULE ; module_element : element_1 | element_2 | element_3 | ... ; 每个元素下方有一个较大的树.现在,当识别exception发生时,我想消耗令牌直到下一个module_element匹配或父端模块匹配. . 关于如何在从defaulterrorsrategy继承的类中执行此操作的任何提示? 编辑:这是MCVE: program.cs namespace AntlrExample { class Program { static void Main(string[] args) { var file
22 2024-04-20
编程技术问答社区
除了用C#编写的ANTLR,是否有有效的替代方案?
antlr是一个很棒的软件,但我认为,对于C#程序员来说,有点不舒服(C#Porting已过时,Parser antlr-3.1.3.jar需要Java等) 我正在寻找一种"更多C#本地"语言工具,以解析简单的类似JSON的语法,任何建议? 解决方案 peg-sharp (C#Packrat Parser)是一个简单但有效的选择. 其他解决方案 我已经使用了金黄色解析器生成器,这是一个免费的软件工具,您可以用来指定BNF语法,然后几乎以任何目标语言(包括C#)生成一个解析器.您还可以通过更改文本模板来修改解析器生成器生成C#代码的方式. http://www.devincook.com/goldparser/goldparser/
22 2024-04-19
编程技术问答社区
使用ANTLR构建自己的C#编译器:编译单元
// Create a scanner that reads from the input stream passed to us CSLexer lexer = new CSLexer(new ANTLRFileStream(f)); tokens.TokenSource = lexer; // Create a parser that reads from the scanner CSParser parser = new CSParser(tokens); // start parsing at the compilationUnit rule CSParser.compilation_unit_return x = parser.compilation_unit(); object ast = x.Tree; 我该如何处理compilation_unit_return类型的X,以提取其根,类,方法等?我必须提取其适配器吗?我怎么做?请注意,在我的CSPARSER(由An
14 2024-04-18
编程技术问答社区
在C#中行走ANTLR AST的教程?
有人知道在C#中散步Antlr生成的AST的教程吗?我能找到的最接近的是 this ,但这并不是很有帮助. 我的目标是通过我正在使用的特定领域的语言来漫步我正在生成的树木,并使用树来输出生成的C#代码. 基于Java的教程也将很有帮助 - 任何提供了如何遍历antlr asts的清晰示例的东西. 解决方案 我通过在 Manuel Abadia的文章. 这是我的版本,我恰好用来将解析的代码转换为c#. 这些是步骤: 实例化实例化您的生成的Lexer,传递该字符串流. 用Lexer实例化令牌流. 用该令牌流实例化解析器. 从您的解析器中获取顶级值,然后将其变成CommonTree. 穿过树: 要获取节点的文字,请使用node.Text. 要获取节点的令牌名称,请使用node.Token.Text. 请注意,node.Token.Text如果它是一个没有相应的字符串的虚构令牌,则只会给您令牌的实际名称.如果是真正的令牌,那么node.Token.
16 2024-04-17
编程技术问答社区
我们什么时候使用ANTLR
任何人都可以指导我在ASP.NET,C#项目中使用antlr dll的目的. i刚刚注意到 antlr.runtime , antlr3.runtime , antlr3.utlitility gassionberies 在某些项目中引用. 如果可以引用一些现实世界的示例或任何指向网页的链接将是有用的. 解决方案 如果您使用Antlr语法在运行时解析任何文本,则需要这些DLL. 通常有两个步骤. 1)在.g文件上运行Java Antlr解析器以生成C#Lexer,C#语法和可能的C#Tree Walkers. 2)将这些文件构建到您的应用程序中.这些文件将与antlr.runtime dll或antlr3.runtime dll一起使用,如果您使用的是antlr版本3. 您的C#程序现在可以使用您在步骤1中编译的语法来解析文本文件. 其他解决方案 Webgrease软件包使用了Antlr软件包. Webgrease软件包由ASP.NET
20 2024-04-17
编程技术问答社区
在ANTLR 4中访问通道,并分别对其进行解析
我已经在Antlr 4中包含了我的评论. 这是我的Lexer语法. COMMENT: '/*' .*? '*/' -> channel(2) ; 我想访问此频道2并在此频道上进行解析以累积评论.因此,我将其包括在解析语法中如下: comment :COMMENT ; 在程序中 string s = " paring string" AntlrInputStream input = new AntlrInputStream(s); CSSLexer lexer = new CSSLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer,2); 然后我想在令牌上进行解析 var xr = parser.comment().GetRuleContexts
16 2024-04-16
编程技术问答社区
为什么antlr3 c#解析器方法是私有的?
我正在ANTLR中建造一个解析器,该解析器将其编译为工作Java目标.当我重新定位C#2时,它会产生一个解析器,其中所有解析方法都是私有的,但标有一个[grammarrule(" lulename")]属性. 被批准的实际援引解析器的意思是什么? 我正在使用ANTLR,2010年11月30日12:45:30 谢谢 安迪 解决方案 这样的至少一个解析器规则"公开": grammar T; options { language=CSharp2; } public parse : privateRule+ EOF ; privateRule : Token+ ; // ... 您可以在生成的解析器上调用parse() protected和private(默认情况下,如果没有指定任何指定).
16 2024-04-12
编程技术问答社区
可视化用ANTLR创建的AST(在一个.Net环境中)。
对于一个宠物项目,我开始摆弄Antlr.在遵循一些教程之后,我现在试图为自己的语言创建语法并生成AST. 目前,我主要在Antlrworks中乱七八糟,但是现在我已经验证了解析树似乎很好(迭代,因为我仍在学习,但仍需要做出一些决定树的最终结构)创建AST.似乎Antlrworks不会可视化它(或者至少不使用"解释器"功能,调试不适用于我的任何机器). 底线:是可视化AST手动方式,遍历/显示或将树在字符串表示中打印到控制台的唯一方法吗? 我正在寻找的是一种简单的方法,可以从输入,语法 - > Visual AST表示Allrworks的"解释器"功能.有什么想法吗? 解决方案 正确,解释器仅显示解析过程中使用的规则,而忽略了任何AST重写规则. 您可以做的是使用StringTemplate创建 dot-file ,您使用某些3rd Party Viewer显示此树(图形) ). 这是Java中的快速演示(我知道一点C#,对不起). 采用以下(过
16 2024-04-11
编程技术问答社区
使用ANTLR 3.3?
我正在尝试开始使用Antlr和C#,但是由于缺乏文档/教程,我发现它非常困难.我为较旧版本找到了几个半心意的教程,但是从那以后,API发生了一些重大更改. 谁能给我一个简单的例子,说明如何创建语法并在短程序中使用它? 我终于设法将我的语法文件编译到lexer和parser中,并且可以在Visual Studio中进行编译并运行这些文件(在不得不重新编译Antlr源之后,因为C#binaries似乎也过时了!据说它可以产生一些输入...然后我应该能够对此做一些事情. 解决方案 假设您想解析由以下令牌组成的简单表达式: -减法(也是Unary); +加法; *乘法; / divis; (...)分组(sub)表达式; 整数和十进制数字. 一种antlr语法看起来像这样: grammar Expression; options { language=CSharp2; } parse : exp EOF ; exp :
24 2024-04-11
编程技术问答社区