Antlr4通道行为

我有以下结构: mode PASS_THROUGH; END_LITERAL: PASS_THROUGH_CHAR* '{/literal}' -> popMode; PASS_THROUGH_CHAR: .+ -> channel( TEXT ); 当执行此模式时,END_LITERAL获取所有预先附加到它的PASS_-THROUGH_字符。 我想所有的PASS_-THROU

尝试在ANTLR4中使用关键字作为标识符;不起作用

我正在尝试获取一些sql关键字,当用作标识符时,它们将被接受为标识符。Antlr的第210页书提出了以下技巧: id : 'if' | 'call' | 'then' | ID ; 我也有类似的想法,但不起作用,我想这是我的误解。 regular_ident是标识符的解析规则,因此: regular_ident : // (1) KEYWORD_AS_IDENT | REGULAR_IDENT ; REGULAR_IDENT是IDEN

Antlr4 优先与可选

我们一直在使用ANTLR 4.7.2设计一种语言,该语言在按优先级排序的列表中的一个运算符上具有可选的修饰符。下面是一个简单的语法示例: simple1 : simple1 K_AND simple1 | simple1 K_BUT K_NOT simple1 | simple1 K_OR simple1 | WHOLE_NUMBER ; 这将产生适当的优先级(和超过,但不超过或) 如果我们向AND case添加可选后缀: simple1 : simple1 K_AND simple

antlr4等于/赋值模糊

我的语法如下: bRules: bRule ( NL bRule )*; bRule: IF WS lhs WS THEN WS rhs; lhs: condition (WS AND WS condition)*; rhs: result (WS AND WS result)*; condition: parameter WS operator WS value ; result: parameter WS EQ WS value ; parameter: STRIN

ANTLR4标记了大量关键字

我想在语法中嵌入一些已知的标识符名称,例如,我的项目的类名是已知的,我想告诉lexer哪些标识符是实际属于类名令牌的已知关键字。但是由于我有一个很长的类名列表(数百个名称),我不想通过在规则中列出所有已知的类名关键字来创建类名lexer规则,这会使我的语法文件太大 是否可以将我的关键字放在一个单独的文件中?我考虑的一种可能性是将关键字放在一个java类中,该类将由生成的lexer类进行子类化。在这种情况下,我的lexer的语义谓词可以只调用自定义lexer超类中的一个方法,以验证输入标记是否与我

“忽略第一”;0“;在ANTLR4中?

我目前正在开发我的MIPS汇编程序,迟早会遇到一个问题。如下说明: JAL $000A2000 结果(十六进制)为: 这是错误的,因为这意味着: JAL $0000A200 当我在指令中遗漏了零,比如: JAL $00A2000 它奏效了,结果是: 0C 02 88 00 所以,我不想总是手工忽略“0”。我希望ANTLR4忽略左侧的第一个值。例如,我喜欢ANTLR4将此转换为: JAL $000A2000 为此: JAL $00A2000 我对ANTLR4还是个新手,还不知道如何才能做

Antlr4算术表示法

我正在解析一种类似SQL的语言,我需要能够处理此类表达式(仅限于示例): 这应该是两列的算术减法 SELECT child-name 这应该是列名“子名称” 我怎样才能做到这一点?在第一种情况下,您应该有4个令牌:选择子女数量-汽车数量 在第二种情况下,您应该只有两个:选择子名称 这可以通过仔细选择lexer规则来实现: SELECT: 'SELECT'; OP_SUB: '-'; ID: [a-zA-Z][a-zA-Z0-9_-]*; WS: [ \t\r\n]+ ->

Antlr4 为什么解析以空格分隔的语句很慢?

我有一个简单的ANTLR4语法,如下所示: grammar Foo; block : statement+ ; statement : expression ; expression : literal | op=('+' | '-') expression | expression op=('*' | '/' | '%') expression | expression op=('-' | '+')

ANTLR4SQL语法

ANTLR4是否有可用的sql语法?如果是,我在哪里可以找到它 有一个来自ANTLR wiki的链接,但该链接已断开:否,在撰写本文时,没有v4 SQL语法 所有v4语法都将放入以下Github存储库(据我从ANTLR邮件列表中所记得的): 现在这里的v3语法: 编辑-2018年4月 现在这里有一个用户贡献的MySQL语法:[已删除死链接] 编辑日期:2020年2月 MySQL、T-SQL、PL/SQL和SQLite语法在这里都可用:目前,v4也有很多SQL语法: (Microsoft SQ

Antlr4 类似JSON语言的语法

我正在尝试为类似JSON的语言设计语法。主要的区别在于属性名不需要双引号(也可以),并且数字只是整数(没有浮点数) 这是一个例子: { "property1": "string value", property2: 321, arr: [1,2,3] } 这是我的语法: 然而,尝试在示例输入上运行TestRig时,我得到 line 2:2 no viable alternative at input '"property"' line 3:10 no viable alternat

ANTLR4语法中第一个解析器规则的返回声明有问题

我正在使用返回作为我的解析器规则,它适用于除第一个解析器规则之外的所有解析器规则。如果我的语法中的第一个解析器规则使用返回声明,则ANTLR4会抱怨如下: 匹配规则时需要ARG\u操作 如果我在上面添加另一个不使用“returns”的解析器规则,ANTLR不会抱怨 这里有一个简化为问题的语法: grammar FirstParserRuleReturnIssue; ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

Antlr4 我可以让antlr 4合并生成的类吗?

我做了一个简单的MIB文件解析器 Antlr 4工具生成以下文件: MibParser.java MibLexer.java MibListener.java MibBaseListener.java 我可以强制antlr 4组合成对的文件以减少混乱吗? 有命令行开关吗 Łukasz Bownik写道: 我可以强制antlr 4组合成对的文件以减少混乱吗 否。如果不需要,可以使用-No listener和-No visitor选项来禁止生成其中两个文件。除了目前没有合并文件的选项外,我完全不

antlr4解决语法歧义

作为帮助我解决解释数字时的歧义的后续行动,我现在进入下一期——数字也被允许作为标识符的一部分,不幸的是,甚至在标识符的开头,所以 这个语法说明了这个问题 grammar NOVIANum; statement : (priorityT | integerT | levelT )* ; priorityT : T_PRIO twoDigits ; integerT : T_INTEGER integer ; levelT : T_LEVEL levelNumber ; levelNu

ANTLR4语义谓词会干扰错误恢复。为什么?

在使用语义谓词时,我在错误恢复中遇到了一些奇怪的行为 我需要错误恢复(特别是单令牌插入),因为我将要解析的文本有许多“单令牌丢失”错误 我还需要语义谓词,因为对于类似(第二种选择)的东西 但这两者似乎不太合拍(我以前看到过这一点,并向SO寻求帮助:;然后我找到了答案;现在我没有) 让语法(如此简单,它匹配任意数量的“A”,用空格分隔,以分号结尾): 通过以下输入运行,生成的解析树为: “A;”:(aaaaa(A)(A)(A);) “A”:(AAAA(A)(A)(A)(A))(这一条在标准上发出

在ANTLR4中保留空格和注释

当我在ANTLR4 tour源代码包中运行InsertSerialID.java或ExtractInterfaceTool.java时,我发现输出中不包含所有空白和注释。因此,输出源代码无法编译或可读。如何保存它们?我发现重定向到一个额外的通道会将它们保存在令牌中,而不是使用skip 它们以Interval的形式保存在ParserRuleContext.getSourceInterval中,尽管我不知道如何将Interval映射到它们的语法类型 WS : [ \t\r\n\u000C]+

ANTLR4外来输入

我的ANTLR4有问题。我试图从Python3代码中打印AST,但是有一些错误,我不知道如何修复它们 我编写了简单的测试代码: a=(1,2,3) print(a) 我运行了程序,但出现以下错误: line 1:1 extraneous input '=' expecting {<EOF>, '.', '*', '(', '**', '[', '|', '^', '&', '<<', '>>', '+', '-', '/', '%', '//', '

带有否定选项的antlr4语法

在antlr4中,我想定义一个字符串,但不包括组合:=允许使用相应的单个字符。定义语法的语法是什么 EQUAL : '='; NUMBER: DIGIT+; DIGIT : ('0'..'9'); LITERALEQUAL: ((CHAR | NUMBER | EQUAL | OTHERS) ' '?)+; fragment CHAR :[a-z]| [A-Z]; fragment OTHERS: '.' | '/' | ':' | '-' | '#' | '?' | '&

Antlr4 如何在不使用@header的情况下使用gradle antlr插件将包名传递给Antl4语法

我试图在gradle中设置Antlr任务,以便在与包名匹配的文件夹中生成源 我已经尝试在语法的@header中添加包,但是这不会以与IntelliJ Antlr插件相同的方式生成包文件夹树。 我已经尝试使用CLI参数,按照下面的示例将包传递给attibutes generateGrammarSource { maxHeapSize = "64m" arguments += ["-package my.package.name", "-visitor"] } 然而我得到的是 任务

Antlr4 如何使用ANTLR实现中的运算符

我正在用ANTLR开发一个DSL,我想实现in操作符,这里是我的语法 x = 3 where x in 2,3,4 这是我语法的一部分 expr : ID GT DATA NEWLINE | ID LT DATA NEWLINE | ID GTEQ DATA NEWLINE | ID LTEQ DATA NEWLINE | ID IN LIST NEWL

如何根据ANTLR4中的关键字跳过输入

我是antlr4的新手,不知道它是否能满足我的需求。以下是一个输入示例: There is a lot of text in this file that i do not care about Lithium 20 g/ml Bor that should be skipped Potassium 300g/ml ... 和代码: SempredParser.g4 parser grammar SempredParser; options { tokenVocab=SempredLex

ANTLR4-外部输入,输入时没有可行的替代方案

好吧,在我来问之前,我已经试过了所有的方法,但这让我发疯了 我正在创建一种简单的语言,用于在自定义NoSQL数据库中查询文档。示例查询如下所示: VALUE("price: " SUM($price) " Average: " AVG($price)).MATCH($price > 5 OR $price < 100 OR $cost > 30) 用于: 但对我来说,这更像是一个黑客而不是一个解决方案 我错过了什么?我很确定这将是一件非常愚蠢的事情。。。但我一整天都在这上面,

递归规则中的ANTLR4顺序

我想描述一下DELPHI的开始/结束区 我使用以下源代码作为输入: begin ModalResult := mrCancel; FGradient.Free; if FMemorizeDimensions then begin if ERROR_SUCCESS = RegCreateKey(HKEY_CURRENT_USER, PChar(gcsREG_KEYBASE), hkR

Antlr4 antlr文本字符串匹配:我做错了什么?

我已经使用antlr三天了。我可以解析表达式,编写侦听器,解释解析树。。。梦想成真了 但后来我尝试匹配一个文本字符串“foo%”,但失败了。我可以找到很多这样的例子。我都试过了 所以我创建了一个小项目来匹配文本字符串。我一定在做傻事 grammar Test; clause : stringLiteral EOF ; fragment ESCAPED_QUOTE : '\\\''; stringLiteral : '\'' ( ESCAPED_QUOTE | ~('\n'|'\r

Antlr4 如何使用Antlr进行语义分析?

我目前正在尝试实现一个ruby编译器。为了创建解析器和lexer,我使用了Antlr4。现在我不知道如何在语法分析器中实现语义分析,有人能解释一下如何使用生成的语法分析器进行语义分析吗?最好用一个简单的例子来解释一下,请说明如何在使用前检查变量是否已初始化。好吧,我无法描述您能做和必须做的一切,但我将尝试向您展示它背后的原理 ANTLR为您生成一个ParseTree,然后您可以使用ParseTreeWalker进行处理。该walker将从最顶端开始逐节点遍历解析树,然后处理所有子级(尽管据我所知

Antlr4 如何使用ANTLR 4定义数组类型?

我目前正在用Antlr 4开发自己的语言DSL,我想知道是否可以定义一种数组类型,例如 fragment DIGIT : [0-9]; STRING : '"' ( ~ '"' )* '"' ; // match string content BOOLEAN: ('true' | 'fase'); INTEGER: DIGIT+ ; DOUBLE: DIGIT+ ('.' DIGIT+)*; // x = ["string","string2",...] ARRAY: ??? 您不会将数组定

Antlr4 在解析器中重新定义令牌类型

需要为COS aka实现语法突出显示 对于语言的一种可能的形式设计 new (new,set,kill) set kill=new 其中:“new”和“set”是命令,也是变量 grammar cos; Command_KILL :( ('k'|'K') | ( ('k'|'K')('i'|'I')('l'|'L')('l'|'L') ) ); Command_NEW :( ('n'|'N') | ( ('n'|'N')('e'|'E')('w

ANTLR4:布尔表达式的解析器

我正在尝试解析以下类型的布尔表达式 B1=p&A4=p | A6=p&(~A5=c) 我想要一棵树,我可以用它来计算上面的表达式。所以我在Antlr3中尝试了这个方法,并在 它在Antlr3中起作用。现在我想对Antlr 4做同样的事情。我找到了下面的语法,并进行了编译。但是我在编写Java代码时遇到了困难 Antlr4语法的开始 我已经编写了Java代码(下面的代码片段),用于获取表达式“B1=p&A4=p | A6=p&(~A5=c)”的树。我期待着&和孩子们B1=p和|。子运算符将有子A

Antlr4:Antlr4中的外部输入

我在运行语法输入流时遇到问题,这是我语法的一部分 expression : .... | ( '+' | '-' | '&' |) expression | expression ('+'|'-') expression .... ; 当输入流如2+2-2或(2+2+2)-2时,会发生错误 line 10:30 extraneous input '-2' expecting {',', '^',...} 为什么我的语法不能区分-2和2-2? 谁来帮帮我 看来您编

ANTLR4中的互左递归规则

我不明白ANTLR4如何能够使用直接let递归来帮助我们。 好的,你可以写一个语法来识别一种语言,好的。但你很少停在这里。通常,您希望对解析的树执行某些操作。为了得到一个直接的左递归,必须将多个规则折叠成一个规则,这在这里没有帮助 举个例子。假设我要定义+和-运算符,并希望它们具有相同的优先级。我会用黄金写下这样的话: expression : binaryExpression | unaryExpression ; binaryExpression : pl

Antlr4 检查访客中的例外情况

我正在学习ANTLR4,以前没有使用解析器生成器的经验 当我定义自己的访问者实现时,我必须重写BaseVisitor的方法(例如,我正在寻找位于的EvalVisitor类)。如果我的方法实现可能抛出异常,我应该怎么做?我不能使用checked异常,因为原始方法有一个空的throws子句。我是否需要使用未检查的异常?(这似乎是一个糟糕的Java设计)。例如,假设在EvalVisitor类中,我希望方法visitId(第41页)抛出一个用户定义的异常,比如unfineded,而不是返回0。我应该如何

Antlr4 v4中的自定义错误报告

关于将代码从v3迁移到v4的另一个问题: 对于v3,我有一个定制的错误报告,在语法文件中使用如下代码: @members { public void displayRecognitionError(String[] tokenNames, RecognitionException e) { String hdr = getErrorHeader(e); String msg = getErrorMessa

ANTLR4中的无序子产品

我想在ANTLR中指定一个产品,其子产品的顺序无关紧要。请注意,我希望每个子产品发生一次。实现这一点的蛮力方式如下所示: grammar Foo; r : (A B) | (B A) ; A : 'a' ; B : 'b' ; 随着子产品的增加,排列的数量增加。。。n/(n-k) 显然,上述解决方案并不实用。在ANTLR中是否有一种结构可以更简洁地描述这样的排列 不,在ANTLR中无法描述产品中的排列。您需要将A、B或C匹配三次,然后使用A检查是否所有三个令牌都已精确匹配一次 您可以使用自

标记中的antlr4混合片段

我观察到一种奇怪的行为,试图使用包含如下语句的语法解析文本: fragment A : ('a'|'A') ; fragment D : ('d'|'D') ; fragment N : ('n'|'N') ; KEY_AND : A N D; 我创建了一个简单的语法来产生我所经历的问题: grammar AndTest; mainRule: NAME SEP KEY_AND SEP NAME; NAME: ('A'..'Z')+ ; SEP: ';' ; fragment A : ('a

Antlr4 ANTLR 4.8 parser.init()不再可用?

我已经有一段时间没有使用ANTLR了,但现在我正在寻找初始化解析,我再也找不到init()方法了??它过去常把欧芹还给我。现在是怎么做到的?v4上没有init()方法,v3中也没有。您只需调用构造函数,然后调用启动规则的解析器方法:FooBarParser parser=newfoobarparser(token\u-stream);parser.start_rule()。可能您的开始符号是init,或者您将解析器细分为包含方法init()?听起来这个语法还有很多。

Antlr4 如何允许使用特殊字符,如*或?在Antlr的令牌中

我在我的antlr语法中指定一个标记,如下所示: ID : [a-zA-Z0-9\*\?]; // Allow tokens such as Asdf*fdsa 但是我得到了一个无效的转义序列\*错误。如何在字符集中指定Antlr允许标记的特殊字符?*和?在字符类中没有特殊含义,不需要转义。所以只要去掉反斜杠就好了 如果希望能够匹配多个字符(如示例所示),还需要在字符类后添加一个+。@GRosenberg抱歉,转录错误。我已经修好了,谢谢。我不敢相信我没有先尝试。

用于重新扫描修改输入的ANTLR4解析器

我想支持一个类似于C++用ANTLR4替换预处理宏的特性,该特性要求解析器稍微后退一点并重新扫描修改后的输入文件 例如,在标准C++中: #define a(x) b(x+1) #define b(x) cc(x) #define p1 a .... p1(p1); 在标准C++预处理器中,标识符 p1 将被替换为 a ,产生(a)< /C> >,然后C++预处理器将>强>只返回该特定行< /强>,看看是否再次应用宏替换,将(a)< /> >转换成 b(A+ 1)。并最终重新扫描该行以

将ST应用于Antlr4生成的解析树

生成的解析树上下文节点访问器不符合getProperty()/isProperty()/hasProperty()标准。因此,ST不能直接应用于解析树。似乎有3种备选方案可将ST应用于生成的解析树: 为每个生成的上下文节点创建ST模型适配器类。然后ST可以直接应用于生成的解析树。这里的重复工作是创建模型适配器 为每个解析树节点创建符合getProperty()/isProperty()/hasProperty()标准的包装器节点。然后ST可以应用于包装器节点。这里的重复工作是创建包装器节点。(在

Antlr4 antlr规则优先级和缺少令牌

关于这一语法: CHAR : ([a-zA-ZÀ-ÿ0-9] | '.' | '_') ; COLON : (':') ; prefix: ('a' | 'b') ; word : (CHAR)+ ; nested: prefix COLON word ; item : word ; input : ( WS | nested | word)* ; 这个输入: gef a:test abc 我想像解析“单词”一样解析abc,但使用这种语法,“abc”与“嵌套”模式匹配(带有“缺少:冒号

Antlr4试验台不';我什么也不退

这是我第一次使用Antlr4,我有一个关于测试设备的问题。 我已经完成了安装过程,并尝试了Antl4主站点和github页面中给出的示例。以下是我所做的: 安装: /usr/local/lib$ sudo curl -O https://www.antlr.org/download/antlr-4.7.1-complete.jar /usr/local/lib$ export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSP

如何最好地使用带有ANTLR4的侦听器,而不让代码变得混乱?

我使用Antlr4解析语法,并使用侦听器生成字节码。当我实现第一组IF-ELSE-ENDIF指令时,事情开始变得有点复杂,因为我必须确保维护上下文信息堆栈来处理嵌套的ID语句及其作用域之类的事情 现在,我准备处理一个IF中组合的多个条件,一旦遇到一个计算结果为false的条件,我就停止计算。问题是我注意到我的代码变得越来越复杂和难以理解。我几乎记不住它的本来面目,我会同情任何人看着它。这是因为我发现我必须在父节点上设置标志和上下文信息,以便让子节点知道如何处理它们从计算中产生的结果 我想到了一些

ANTLR4:遵循什么设计模式?

我有一个规则“表达式”,可以是“数学”或“比较”,但“比较”可以包含“数学”。这里有一个具体的代码: expression : ID | maths | comparison ; maths : maths_atom ((PLUS | MINUS) maths_atom) ? // "?" because in fact there is first multiplication then pow and I don't want t

ANTLR4跳过没有或没有差异

我看不出斯基普做了什么;这就是一个例子 FS : WHITESPACE* (',') WHITESPACE*; WHITESPACE : [ \r\t\n]+ ->skip; 当我在TestRig中使用ANTLRWorks2运行时,我看不到有无->skip之间的区别。可视化树包含(我将使用普通点作为空格),。\r\n 使用或不使用->skip有什么区别?空格字符本身将被跳过,但当它们围绕逗号时不会被跳过。如果希望跳过它们,请不要将它们包括在FS规则中: FS : ','; WHITESP

Antlr4 如何匹配没有空格分隔的序列

我试图匹配的规则是:hello后跟一系列字符。如果序列中包含字母表,则应与str规则匹配,否则应与num规则匹配 例如 hello123-123应该由num规则匹配 hello1a3-1a3应与str规则匹配 我写的语法如下: grammar Hello; r: 'hello'seq; // seq: str | integ; seq: num | str; num : DIGITS; str : CHARS; DIGITS: [0-9]+; CHARS : [0-9a-zA-Z]+; WS

ANTLR4解析期间的StackOverflower错误

输入:toAccount='电/水' 语法: 我猜它与字符串值中的/有关,因为没有它,表达式可以成功解析。我试图调试它,但我不明白在ANTLR引擎盖下发生了什么。我也曾在谷歌上搜索过在ANTLR中逃跑,但据我所知,没有必要逃脱刀砍 另外,关于语法的一般性评论也很受欢迎,这是我的第一个评论 有什么想法吗?问题在于设置范围操作符,也称为“破折号”。要将范围运算符作为文本包含,必须对其进行转义 STRING_VALUE: '\'' [a-zA-Z0-9\-/ ]+ '\'' ; 或将其指定为集合中的

Antlr4 为什么我的antlr语法会给我一个错误?

我有下面的小语法节点是开始生产的节点。当我的输入是(a:b)时,我得到一个错误:行1:1外部输入'a'应为{':',INAME} 为什么会这样 编辑-我忘记了lexer和parser作为单独的阶段运行。当解析器运行时,lexer已经完成。当lexer运行时,它不知道解析器规则。它已经根据@bart下面的推理做出了类型/INAME选择类型的决定 grammar g1; TYPE: [A-Za-z_]; INAME: [A-Za-z_]; node: '(' namesAndTypes ')';

Antlr4 带有ANTLR 4的配置解析器

我在使用ANTLR 4创建配置解析器时遇到一些问题。配置文件具有以下语法: section1{ key=value; key=value; } section2{ key=value; } 我还编写了一个lexer/parser: grammar Config; fragment IdentifierText: [A-Za-z]+[A-Za-z0-9]*; fragment IdentifierNumber:[0-9]+'.'?[0-9]*; fragment IdentifierBool

ECMAScript 6语法中的Antlr4性能问题

我正在为ECMAScript 6编写语法。语法写在两个文件中:和 生成的解析器工作正常,但性能非常差。在一个循环中,第一次解析和下一次解析之间有很大的区别。例如,prototype.js文件(约2500行)的第一次使用LL prediction模式解析当前大约需要8-12秒,下一次解析在我的机器上大约需要890-990毫秒。在一些语法优化之前,第一次解析大约需要58秒,第二次解析大约需要7秒。当我尝试SLL解析器时,为了获得更好的性能,建议这样做,即使在30分钟之后,第一次解析也没有完成,因此解

Antlr4 指定给不是集合ANTLR 4的块的标签值?

当我制定这样的规则时 /* date type */ date: 'date' '(' value = STRING ')' ; /* field["value"] */ key: name = ID '[' value = STRING ']'; whereExpr: key op =('>'|'<'|'>='|'<='|'=') value = (STRING | ID | INTEGER | DOUBLE | date ) ; 为什么?。 如何解决这个问题?您只能

ANTLR4-如何更改源代码并将其取回?

我想重写一些代码 然后,我想把重写过的代码拿回来 首先,我想替换字符串文字: local var = "%%var%%" // to local var = "SOMETHING" 其次,我想删除函数名和括号: function sayHello (a) local var = "%%var%%" print("Hello") end //to function (a) local var = &quo

上一页 1 2  3   4   5   6    7   8   9  ... 下一页 最后一页 共 15 页