避免角括号的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
10 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: '(';
20 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
编程技术问答社区
如果在循环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
编程技术问答社区
使用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
编程技术问答社区
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
编程技术问答社区
有没有可能在输入无效的情况下抛出一个异常?
我有一个简单的ANLTR语法和随附的访客.一切都很好,除非输入无效.如果输入无效,则吞咽错误,并且我的计算器出现错误的输出. 我尝试实现一个错误的侦听器,而是骑了Lexer的Recover方法,.......................................有人可以向我展示如何简单地丢下错误而不是吞下不良的"代币"? (我之所以使用引号,是因为它们根本不是令牌.字符在我的语法中不确定.) 有效输入: 1 + 2 * 3-4 无效输入: 1 + 2 + 3(4) 如果解析器/Lexer遇到括号(或任何其他未定义的字符),我想扔一个ArgumentException.目前,无效的角色似乎只是消失在以太中,而解析器只是没有错. . 如果我使用grun命令在控制台中运行它,我将获得以下输出,因此它可以在某个级别上识别无效令牌. 第1:9令牌识别错误:'(' 行1:11令牌识别错误:')'' 和由此产生的解析树. bas
22 2024-04-18
编程技术问答社区
在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
编程技术问答社区
ANTLR岛屿语法和一个非贪婪的规则,消耗太多
我遇到了岛屿语法和一个非怪兽规则,用于消耗"除了我想要的东西". 所需的结果: 我的输入文件是一个C标头文件,其中包含函数声明以及Typedefs,structs,Comment和Pread Crosessor定义. 我所需的输出是解析和随后的函数声明转换.我想忽略其他一切. 设置和我尝试的内容: 我正在尝试使用LEX的标头文件非常均匀且一致. 每个函数声明之前都有一个链接宏PK_linkage_m,所有函数返回相同的类型PK_ERROR_code_t,例如: PK_linkage_m PK_ERROR_code_t PK_function(...); 这些令牌除了在函数声明开始时没有出现其他任何地方. 我已经将其作为岛语法,也就是说,在文本海洋中发表了功能声明. 我试图使用链接令牌PK_linkage_m表示"文本"的末尾,而PK_ERROR_code_t令牌作为函数声明的开始. 观察到的问题: 在Lexing和解析单个函数声明有效时
10 2024-04-10
编程技术问答社区
Antlr 4解析大的c文件需要很长时间
我有一个大的C代码文件(> 9000 LOC),并尝试使用此语法来解析它: https://github.com/antlr/grammars- v4/blob/master/c/c.g4 我等了一个多小时才流产.该机器是带有4GB RAM的Core 2 Duo L9400.最大Java VM-HEAP大小设置为2GB. 它不会产生任何解析错误,但根本没有完成. 进行了一些研究后,我将预测模式设置为SLL,这会产生一个 "在输入中没有可行的替代方案". 接下来,我将预测模式设置为ll_exact_ambig_detection,并将诊断式ERLISRORLISTENER连接到解析器.这会产生许多"歧义报告",主要是 关于声明/声明专业人士.我认为这迫使解析器经常回溯,这可能是长期解析时间的解释? 除了尝试重写语法外,我还能做些什么来提高性能? 任何帮助都将被赞赏;) 解决方案 首先,必须注意,解析过程中Antlr 4 从未回溯. 您所指的
16 2024-04-09
编程技术问答社区
用antlr制作计算器
是使用antlr的新手.我正在制作一个计算器,并且已经制作了语法.如果我使用侦听器而不是访客,可以获得结果吗?我不知道这是否有意义,但是我正在使用侦听器,而我唯一能够做的就是将其打印出输入,而不是输入中计算出的结果.我已经在线检查,每个示例都使用访问者.那么,我应该使用访客还是在某种程度上可以在使用侦听器时获得结果?我希望这是有道理的. 这是我的G4文件 grammar calc; TYPE_INT: 'int'; TYPE_FLOAT: 'float'; EQU: '='; MUL: '*'; DIV: '/'; PLU: '+'; MIN: '-'; L_BKT: '('; R_BKT: ')'; WRITE: 'write'; END_MARK: ';'; ID: ([A-Z]|[a-z]) ([A-Z]|[a-z]|[0-9])*; INT: ('0'|([1-9]([0-9])*)); FLOAT: ('0'|([1-9]([0-9])*))'.'([0-9]+)
20 2024-02-27
编程技术问答社区
当有类似模式时,ANTLR不能正确地匹配配对。
我正在使用antlr解析一些查询. 这是我的antlr g4: propTest : objectPath NOT? (EQ|NEQ) primitiveLiteral # propTestEqual | objectPath NOT? (EQ|NEQ) 'wwww' # propTestThlEqual ; primitiveLiteral : orderableLiteral | BoolLiteral ; primitiveLiteral : orderableLiteral ; orderableLiteral : StringLiteral ; StringLiteral : QUOTE ( ~['\\] | '\\\'' | '\\\\' )* QUOTE ; 我用以下问题进行问题: [network-traffic:src_port = '123] 我希望匹配发
8 2024-02-27
编程技术问答社区
antlr4'的golang访问者模式处于可用状态吗?
我看到没有工作的示例,并且看到一些持续打开的请求. 我想避免沿着花园小路走. 也有拉的请求使我认为golang目标可能死在水中. 所以我真正要问的是我应该避开Golang,还是Google看不到的地方的文档: - ) 解决方案 给那些不单击此问题的人.访客模式可用. 我写了一个示例应用在这里 我认为它不是按照我应该的方式写的,但它可以做我想做的事情.可以在此问题上找到更多讨论,如果我学到了新知识,我将更改代码.
26 2024-02-27
编程技术问答社区
有没有可能让Antlr4从基础语法词库而不是生成词库来生成词库?
i有lexer grammar调用BasicTokens它是我语言的基本令牌集,具有null,true,true,false等的令牌. 现在,当我创建解析器语法时,BasicGrammar导入BasicTokens和另一个称为InheritedGrammar的语法 当antlr4生成InheritedGrammar的解析器时,它包含了BasicGrammar中已经定义的所有规则. 是否有一种方法使ANTLR仅描述InheritedGrammar中生成的规则,而不是BasicGrammar中的规则,也可以继承BasicGrammarParser而不是Parser? 解决方案 由于Antlr 4实现导入的方式,这是不可能的. 如果语法x导入语法y,该操作的行为如下: 加载语法y(及其所有规则). 将语法x的规则添加到规则的集合中.如果发生任何名称碰撞,请用y中的规则替换为x. 中的规则. 到达代码生成器时,规则层次结构已完全平坦.
28 2024-02-27
编程技术问答社区
重叠的规则--不匹配的输入
我的语法(如下(原始修剪)需要重叠的规则 grammar NOVIANum; statement : (priorityStatement | integerStatement)* ; priorityStatement : T_PRIO TwoDigits ; integerStatement : T_INTEGER Integer ; WS : [ \t\r\n]+ -> skip ; T_PRIO : 'PRIO' ; T_INTEGER : 'INTEGER' ; Integer: OneToNine Digit* | ZERO ; TwoDigits : Digit Digit ; fragment OneToNine : ('1'..'9') ; fragment Digit: ('0'..'9'); ZERO : [0] ; so"整数"和" Twodigits"在一定程度上重叠. 以下输入 INTEGER 10 PRIO
26 2024-02-27
编程技术问答社区
ANTLv4中的Flex 'r/s'
flex: ‘r/s’ " r",但前提是" s".在确定该规则是否是最长匹配时,包括" S"匹配的文本,但然后在执行操作之前返回输入.因此,动作只能看到文本与" r"匹配.这种类型的模式称为尾随上下文. (" r/s"的一些组合无法正确匹配.有关危险的尾随环境,请参见限制.) 在antlrv4中如何? 解决方案 我完成了两种主要方法. 第一个涉及一个简单的语义谓词. 'r' {_input.LA(1) == 's'}? 第二个更为复杂,并且涉及在匹配后重置输入流位置,在该匹配项下,在规则的一部分中实际对后续上下文进行了编码.该行为实际上显示在Antlr 4测试套件的一部分中.
24 2024-02-27
编程技术问答社区
N次方运算符解析
我试图在数学表达式中匹配可变arity的操作员(例如" 1 expression: '(' expression ')' # parenthesisExpression | expression ('*' | '/' | '%') expression # multiplicationExpression | expression ('+' | '-') expression # additionExpression | expression (SMALLER_THAN expression)+ # smallerThanExpression | IDENTIFIER # variableExpression ; 我们如何保持优先级,但仍将较小的thanexpression解析为贪婪? 例如; " 1 解决方案
10 2024-02-27
编程技术问答社区
在Java中使用antlr parsetree解析sql查询到mongo bson文档
我有一个像查询示例这样的SQL: Select id,name from employee where age > 30 and department = 'IT' limit 200 SQL查询语法器是在Antlr4语法文件中定义的.是否有任何将此查询的解析树转换为BSON文档的实现? 然后,BSON文档将用于查询Mongo DB. 解决方案 在我以前的工作之一中,我做了类似的事情:有一个查询(不是SQL,但非常相似),并将其转换为Mongo查询. 我没有代码可以共享,但是我可以分享我的想法: Mongo不符合SQL,因此您不能只采用SQL语法.加入和所有关系代数呢?在Mongo凭借其聚合框架在Mongo中非常棘手的聚合呢?在相反的方向上,您如何生成在Mongo中翻译成"存在"子句的SQL.有很多这样的事情,有些很小,有些是巨大的,但是底线您必须谈论某种SQL的子集,有些DSL被允许用作查询语言,并且看起来像" SQL",因为人们习惯了SQL.
22 2024-02-27
编程技术问答社区
Antlr4: 当有转义字符和回车时,单引号规则失败,新行
我有一种语法: grammar Testquote; program : (Line ';')+ ; Line: L_S_STRING ; L_S_STRING : '\'' (('\'' '\'') | ('\\' '\'') | ~('\''))* '\''; // Single quoted string literal L_WS : L_BLANK+ -> skip ; // Whitespace fragment L_BLANK : (' ' | '\t' | '\r' | '\n') ; 这个语法 - 尤其是L_S_STRING - 似乎与: 的香草输入一起工作正常 'ab'; 'cd'; 但是,此输入失败: 'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\''; 'cd'; 我将第一行更改为任何一个 'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z''';或 'yyyy-MM-dd\\'T\\'HH
8 2024-02-27
编程技术问答社区
Antlr4打印'无关的输入'错误,即使有预期的输入也是如此
我正在尝试解析 smiles 使用 " http://www.opensmiles.org/spec/open-smiles-2-grammar.html" rel =" nofollow"> opensmiles 规格. 语法: grammar SMILES; atom: bracket_atom | aliphatic_organic | aromatic_organic | '*'; aliphatic_organic: 'B' | 'C' | 'N' | 'O' | 'S' | 'P' | 'F' | 'Cl' | 'Br' | 'I'; aromatic_organic: 'b' | 'c' | 'n' | 'o' | 's' | 'p'; bracket_atom: '[' isotope? symbol chiral? hcount? charge? atom_class? ']'; symbol: element_symbols | aromatic_s
8 2024-02-27
编程技术问答社区