Antlr 带和不带初始化的变量定义树

我要解析的语言包含如下语句 public var a, b = 42, c; 即.g文件看起来像: statements : (introduction | expression ';'! | ... )+ ; introduction : head single+ -> ^(head single)+ ; single : Name ('='^ expression)? ; head : modifiers* v='var' -&

不带空格的Antlr3匹配令牌

给定输入“term>1”,数字(1)和比较运算符(>)应在AST中生成单独的节点。如何做到这一点 在我的测试中,只有当“c”和“1”之间用空格分隔时,匹配才会发生,如“术语注) (和?a=notEx->^(和节点$andEx$a))*; 俄勒冈州:安第斯山脉(或安第斯山脉)*; countExpression:COUNT LPARENTHESIS WORD RPARENTHESIS relationship number->^(COUNT WORD relationship number); n

Antlr 如何防止标识符和字符串关键字相互碰撞

我的代码中有以下几种情况: get?( id?:string ): any; 更糟糕的是: export function urlAppend( url?:string, string?:string ): string; 在我的解析器中,我将'get'和'string'定义为若干规则的一部分,这意味着它被隐式地放入lexer中。但是,对于属性和方法名称,它们还需要分类为标识符 有什么办法可以让它工作吗 (语法是针对JavaScript和TypeScript的,如果有帮助的话。)ANTLR在

替换时无法识别ANTLR4标记

我试图修改sqlite语法的语法(我只对where子句的一个变体感兴趣),但在替换和替换它自己的标记时,我一直有一个奇怪的错误 grammar wtfql; /* SQLite understands the following binary operators, in order from highest to lowest precedence: || * / % + - << >> &am

ANTLR4自定义令牌

我正在使用C#version生成ANTLR4文件。我通过使用此选项TokenLabelType=Token使用了自定义令牌。一切正常,但c编译器在MAtch(…)和input(…)中给出了错误,因为这不会对我的自定义标记进行类型转换。而ANTLR3为该函数提供了适当的类型转换。我正在从这个类扩展我自己的令牌Antlr4.Runtime.CommonToken C#编译器抛出此错误 Cannot implicitly convert type 'Antlr4.Runtime.IToken' to

用于ANTLR4的带intellisense的代码编辑器

正在寻找使用intellisense构建基于ANTLR4语法的代码编辑器的示例。SharpDevelop提供了所有代码编辑器功能,但是如果我们需要提供intellisense和代码完成细节,那么我们需要编写自己的解析器 需要示例,其中ANTLR4、SharpDevelop用于构建自定义语言的代码编辑器 谢谢。我已经将Jide CodeEditor与antlr4一起使用,它似乎工作正常,但花了一些时间来整合。我从解析器生成用于突出显示的错误和关键字。我使用侦听器进行解析等,并使用访问者执行语言。不

解析字符串antlr

我将字符串作为解析器规则而不是lexer,因为字符串中可能包含带表达式的转义,例如“变量是\(变量)” 这不起作用,因为匹配任何标记而不是任何字符,所以许多标识符将被匹配,空白将被完全忽略 如何解析可以包含表达式的字符串 查看Swift和Javascript的解析器,这两种语言都支持类似的东西,我不知道它们是如何工作的。据我所知,他们只是输出一个字符串,比如“我的字符串中有(变量)”,而实际上无法将变量作为自己的东西进行解析。这个问题可以使用词法模式来解决,一个模式用于字符串内部,一个(或多个)

antlr3语法中不能忽略空格

我正在编写一个简单的antlr3语法来解析hello world number格式。 hello、world或number之间的空格不会被忽略 fragment H_ : 'h' | 'H'; .. fragment W_ : 'w' | 'W'; HELLO : H_ E_ L_ L_ O_ ; WORLD : W_ O_ R_ L_ D_ ; SEMI : ';'; INTEGER_NUM : ('0'..'9')+; WS : (' '|'\r'|'\t'|'\n') {$chann

ANTLR语法在解析类似规则时不会回溯

假设我有一个处理全局变量的语法和一些C变量的方法声明 program: (declaration)* (procedure)*; declaration: typespec identifier ';'; procedure: typespec identifier '(' ')' ';'; typespec: 'char' | 'int'; identifier: ('a' .. 'z' | 'A' .. 'Z') ('A' - 'Z' | 'a' .. 'z' | '0' .. '9' |

antlr中的AST树。我可以向其中添加状态对象吗?

现在,我们有代码可以从一个AST树转换为它们自己的树。我更愿意去掉第二棵树(理解一棵树已经足够困难了,更不用说当你加入一个项目时理解两棵树了,因为树是复杂的)。其中一个原因是人们在树上散步时看到了这些东西 我想知道,在树漫游期间,我是否可以以某种方式将状态添加到具有查找信息的CommonTree 我想看到的是这样的东西 CommonTree tree = parent.getChildren().get(0); tree.setState(myMapOrObjectState); 这允许我在传

Antlr 如何将自定义代码注入lexer的mToken()

我可以通过lexer规则中的{}块将自定义代码注入mToken()吗?不可以。由于这个mToken()方法在超类Lexer中是抽象的,Lexer从您自己的语法派生而来,因此您也不能在Lexer的@members{…}部分重写它。我下面的答案基本上回答了您的问题。也许你想提出一个新的问题,问你如何才能解决你所面临的真正问题。

ANTLR读取值块

我已经为此工作了两天多,但没有成功。这将是一个常见的问题,但我找不到解决办法。我做了一次搜索 问题: 我有一些我想读的数据,比如说,每行5个值。我知道我想从以前读取的值中读取多少。例如,要读取的6个值,分布在2行上 6 10 20 30 40 50 60 所以在每5个变量之后,我想读一行。如果有0个变量,我想跳过这一位,如果我想读取5个变量的精确倍数,那么我想避免重复NL调用 我试过这个 varblock[ Integer count ] @init{ Integer varIndex = 0

基于模式的ANTLR树重写

我在ANTLR 3中掌握了相当基本的语法,我希望做以下工作: -如果“+”出现在“术语”前面,只需删除它,因为它是多余的(完成)。 -如果一个“-”出现在一个“term”的前面,保留它,但是在第一个子节点中添加一个“0”,这样我就可以有效地从“-2”转到“0-2” 我曾尝试过树重写,但在匹配可能的'-'时似乎陷入了困境 注意:ADD表示“+”,减号表示“-”。假设INTEGER是文本0所需的标记类型,您可以使用以下方法: unaryterm : ADD! term | M

antlr nongreedy运算符无法匹配有效输入

antlr4中的以下规则对于有效输入无效: testSimple : 'name' 'eq' WORD+? .*? NEWLINE WORD: ~[ \t\f\r\n]+ ; 输入为: name eq John Tom Allen notAName 错误是: line 1:8 no viable alternative at input 'John' 我知道使用nongreedy操作符有一些限制,比如后面的“第一场比赛获胜”规则。而这一规则尤其模棱两可。但它不应该至少以一种方

ANTLR和空字符串的矛盾行为

我根本不明白antlr是如何工作的。使用以下语法: blockcomment : '/\*' ANYCHARS '\*/'; ANYCHARS : ('a'..'z' | '\n' | 'r' | ' ' | '0'..'9')* ; 当我编译语法文件时,我收到一条警告消息,上面说: “非片段lexer规则'ANYCHARS'可以匹配空字符串” 好的。我希望它能够匹配空字符串,因为:“/\*\*/”是完全有效的。但是当我在TestRig中运行“/\*\*/”时,

ANTLR同一解析器规则的零到多次出现

我试图解析javadoc风格的注释。我如何指示相同的解析器规则可能被触发零次或多次 doc_comment : '/**' (param_declaration)* '*/' ; param_declaration : OUTERWS '@param' OUTERWS ID OUTERWS; ID : ('a'..'z')+ ; OUTERWS :

ANTLR-解析器规则中的字符串文本覆盖其他规则

我已经定义了一些十六进制字节规则,它应该匹配两个十六进制([a-fA-F0-9])字符。我在几条语法规则中都用到了这个 饥饿的 grammar hungry; expr: message NEWLINE; message : hex_byte specificMessage ; hex_byte : a=HEX_BYTE ; specificMessage : '05' lunchRequest | '06' dinne

antlr4唐';t匹配我所做的字符串';我不知道

我想匹配此字符串:ab.cd是,但它不匹配 如果我将is更改为=,它可以匹配ab.cd= path : PATHS 'is' ; PATHS : FIELD('.'FIELD)*; fragment INT : '0'..'9'+ ; FIELD : ('0'..'9'|'a'..'z'|'A'..'Z')+|'*'|INT; 你犯了什么错误?当我运行您的示例时(在添加了忽略空白的模式之后),它与您的输入相匹配。正如Jeff所说,我认为忽略空白可以解决这个问题。尝试以下操作:WS:[\t\n

antlr4:在给定的上下文中,如何知道选择了哪一个备选方案

假设有关于“类型”的规则。它是预定义类型(由标识符引用)或类型描述符 type : IDENTIFIER | typeDescriptor ; 在我的程序中,我有一个typeContext“ctx”的实例。我如何知道是选择了路径标识符,还是选择了typeDescriptor 我认识到一种方法是测试ctx.IDENTIFIER()==null和ctx.typeDescriptor()==null。但是,当有更多的选择时,它似乎不太管用。有没有方法返回一个索引来指示选择了哪个规则?谢谢 否

ANTLR3树语法:循环与输入处的任何内容都不匹配';EOF';

我试图创建我的第一个ANTLR3树语法,但我一直遇到同样的问题。解析器的输出是: $ echo 'foo, bar' | ./run.sh foo bar TreeGrammar.g: node from line 0:0 required (...)+ loop did not match anything at input 'EOF' Exception in thread "main" java.lang.NullPointerException at Driver.main(

在ANTLR 4解析树中获取令牌的正确StopIndex时出现问题

目标 我一直在尝试编写一个简单的逐步简化算法,它将简化给定的逻辑方程并显示简化步骤。首先,我决定实现括号中的缩减。要检索所有嵌套括号,我使用ANTLR 材料 我为逻辑表达式编写了一个简单的语法,试图使用ANTLRv4的左递归功能: Binary.g4 grammar Binary; expr : LPAREN expr RPAREN #ParExpr | NOT expr #NotBlock | expr AND expr #A

Antlr 控制解析器规则替代优先级

我有一个表达式如果1,那么2,否则3*4。我希望将其解析为如果1那么2 ELSE(3*4),但是使用下面的语法(摘录),它将其解析为(如果1那么2 ELSE 3)*4 formula: expression EOF; expression : LPAREN expression RPAREN #parenthesisExp | IF condition=expression THEN thenExpression=expression ELSE elseExpression=exp

是否有工具可以在ANTLR和其他形式的BNF之间转换?

是否有任何工具可以将ANTLR语法转换成其他BNF语法或从其他BNF语法转换成ANTLR语法?有几种形式的巴科斯诺尔形式(BNF、EBNF、ABNF、W3C-BNF、XBNF…)和规范,例如。ANTLR语法似乎只适用于。我知道ANTLR语法文件包含的不仅仅是上下文无关语法的规范,但是您至少应该能够转换公共子集——有人已经自动完成了吗 雅各布写道: ANTLR语法似乎只能通过示例来描述 ANTLR(v3)是用“它自己的话”(正如特伦斯·帕尔自己所说)写成的语法: 雅各布写道: 但是您至少应该能

ANTLR中If语句到树的表示

我有以下正确解析的if语句: ifStatement : 'IF' expression 'THEN' statementBlock (options {greedy=true;} : 'ELSE' statementBlock)? ; 现在,我想将其解析为AST。我就是这样做的: ifStatement : 'IF'^ expression 'THEN'! statementBlock (options

ANTLR-以下备选方案永远无法匹配

我不明白为什么这个简单的语法- grammar Test; file : ID; ID : .*; 导致这个错误- Test.g:3:6: The following alternatives can never be matched: 1 为什么会发生这种情况?在lexer规则末尾使用*和+在ANTLR中是非法的: ID : .*; // illegal ID : 'bar' .*; // illegal ID : .* 'bar'; // legal 在解析

如何解决Antlr3中的这种解析歧义

希望这是正确的信息量来帮助我解决这个问题 给定以下ANTLR3语法 grammar mygrammar; program : statement* | function*; function : ID '(' args ')' '->' statement+ (','statement+) '.' ; args : arg (',' arg)*; arg : ID ('->' expression)?; statement : assig

简单antlr4语法中的输入错误不匹配

我正在尝试使用antlr4解析SQL的一个简单子集 我的语法是这样的: grammar Query; query : select; select : 'select' colname (',' colname)* 'from' tablename; colname : COLNAME; tablename : TABLENAME; COLNAME: [a-z]+ ; TABLENAME : [a-z]+; WS : [ \t\n\r]+ -> skip ; // skip spaces

Antlr 语法粒度的多选择和经验法则

我问了相关的问题,现在我有一个新问题,但实际上我是在问一些思考的一般规则 以下是语法: grammar post2; post2: action_cmd+ ; action_cmd : cmd_name action_cmd_def ; action_cmd_def : (cmd_chars | cmd_literal)+ Semi_colon ; cmd_name : 'a'..'z' ('a'..'z' | '

将ANTLR v3语法迁移到ANTLR v4

我们为ANTLRv3编写了语法,我想迁移到ANTLRv4。有迁移指南吗。另外,我还想知道对现有V3语法的修改,以便更好地利用v4功能。如果您在V3或更早版本中使用AST构造和树解析,将是最大的成功。这有很大的区别。您不再有AST生成(它现在生成解析树)或树漫游器(您现在使用解析器侦听器或解析树访问者) 我还没有看到迁移指南,但是如果您正在浏览v4文档,并且当前正在使用AST或Tree Walker,请查看v4中有关解析树、侦听器和访问者的部分 大多数其他更改都是为了使编写解析器变得更容易,不过如

测试时未识别ANTLR数学符号

我在antlr语法中遇到了一个奇怪的问题。它看起来如下所示。现在的问题是,当我测试“singlerule”时 X.Y等于A.B有效,但是所有的数学操作,如X.Y>100无效。它抛出一个错误:行1:4在输入'>'处没有可行的替代方案。 请帮助我理解为什么会出现这个问题 grammar RA; options { language = Java; } DIVIDE : '/'; PLUS : '+'; MINUS : '-'; STAR : '*'; MOD : '%'; LPAREN

如何将已经构建的antlr4 Cobol解析器改编成Antl3接口

我已经构建了一个用于解析Cobol文件的antlr v4语法。它经过测试,功能齐全。现在我需要调整它以在XText项目中使用(不幸的是使用了antlrv3)。我如何在不备份语法的情况下实现它(并失去所有已经构建的侦听器和访问者) 在对这个问题进行了一些思考之后,我想知道是否有一种方法可以生成ANTLRv3接口适配器来使用ANTLRv4解析器和Lexer。如果是这样,我可以“调整”XText,这样它就可以通过这个适配器接口使用我已经构建的antlrv4类 有人已经做过类似的事情吗?我们目前也在解决

antlr生成的解析器中的输入不匹配

我有一个简短的ANTLR语法: query : word (WS word)+; word : simpleword | compoundword; compoundword : simpleword (NONWORD+ simpleword)+ | NONWORD+ simpleword (NONWORD+ simpleword)* NONWORD*; simpleword : SIMPLEWORD; SIMPLEWORD: [0-9a-zA-Z]+; NONWORD: [-_]; WS

与antlr语法谓词不匹配

我的语法文件中有以下lexer规则: LINE : 'F' | 'G'; RULE : (('->' ('F' | 'G')) => 'F' | 'G' ) | LINE LINE + | LINE * (ROTATE + LINE+)+ ; fragment ROTATE : ('/' | '\\'); 我基本上是在尝试匹配看起来像F->F/F\F\F/F的产品。它成功地匹配了上述内容,但我猜我的语法谓词有

ANTLR,步骤顺序

我正试图为ANTLR中的C#这样的语言设计一个编译器。但我并不完全理解应该采取的步骤的正确顺序 我是这样看的: 首先我定义Lexer标记 然后是语法规则(使用重写规则来构建AST)以及收集类和方法声明信息的操作(这样我就可以在下一步中解析方法调用) 最后,我创建了“树语法”,它遍历AST树并调用生成(虚拟)机器语言操作码的规则 这是正确的吗?第二步的角色是读取方法的声明和构建AST吗 如何在没有构建AST的情况下解析重载方法的声明?(backpatching?看看它,它解释了如何创建自己的语

捕捉;所有其他;ANTLR中的字符

我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效语法运行良好。但是,当前如果您在某个地方输入语言中未定义的任何字符(例如“?”字符),自定义编辑器将立即崩溃,因为它无法找到该字符的规则 在ANTLR中是否有一种方法可以捕获和跳过与规则不匹配的每个字符(可能输出错误消息),而不会导致整个lexer崩溃和烧毁?我只想标记无效字符,跳过它们,然后继续词法分析,例如: //some rules + tokens invalidCharacter : <&l

区分标识符和变量名的简洁方法(ANTLR)?

在ANTLR语法中,我们如何区分变量名和标识符 VAR: ('A'..'Z')+ DIGIT* ; IDENT : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*; 这段语法(在ANTLR中)不起作用,因为编译器会抱怨某些输入可能永远无法到达IDENT。这似乎是编译器编写人员的一个典型的头部攻击 对于ANTLR用户,你能告诉我你解决这个问题的好方法吗?谢谢 泽尔写道: 这段语法(在ANTLR中)不起作用,因为编

Antlr 为什么这个规则中有递归溢出?

这是对这个问题的“跟进”:(知道root规则现在已重命名为atom) 在我的ANTLR语法中,我现在尝试添加对强制转换的支持: cast : '(' type ')' atom -> ^(CAST type atom); 现在,我需要让它成为价值树的一部分。由于强制转换本身是原子的,可以作为层次结构的基础,并且可以用于任何二进制操作(因子、求和、比较),因此我认为它必须符合原子(以前是根)规则 幸运的是,这次一切似乎都足够了。但是,我得到了从type到type的无限递归: type :

Antlr 基于递归下降的计算器堆栈溢出

TL;医生: 我的计算器语法依赖递归下降将括号组嵌套在彼此内部,但嵌套的括号太多(大约20个)会导致堆栈溢出。我怎样才能解决这个问题?有没有办法使问题更简单 长格式: 就在不久前,我的头深深地陷入了小规模的嵌入式系统中,没有半个大脑的人会遇到堆栈溢出。现在,由于一项更抽象的任务,我谦卑地来到这里寻求建议 激励项目是一个Android计算器。当前的计算器在很多方面都明显不足,但我今天没有带我的肥皂盒,所以我将直接讨论我遇到的问题:堆栈溢出 特别是,当用户创建太多嵌套括号组时,包括函数等。这是因为我

Antlr标识符与和不匹配

使用Antlr 3.5规则: ID : ':'? ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ; 不匹配:标准 有人能解释一下原因吗 下面是完整的语法。您可以使用规则colname对照“标准”进行测试 语法Sql; 选择权{ 语言=Java; 输出=AST; } @rulecatch{catch(识别异常e){throw e;}} @标题{ 包com.something.antlr.sql; 导入j

Antlr 解释器被禁用

我想用Antlr3.5和Java1.6+创建一个简单的编译器,我添加了jar文件,但我得到了这个错误,“Reason无法创建语法”,但我不明白为什么会有任何帮助?它并不是全部代码,但我试图逐位编译代码,但它仍然没有编译 grammar LittleNic; @members { public ErrorReporter err; public void displayRecognitionError(String[] tokenNames,

antlr匹配不同的支架零件

我要定义以下语言,显然,ANTLR并没有向easy泄露它的秘密 ui { screen X { input() checkbox() } } model { // any text // even {} } 我会定义 ui: UI OBR (screen)* CBR; screen: .... model : MODEL modelBody; modelBody: BRACKETED_TEXT; OBR: '{'; CBR: '}'; ... TEXT

如何告诉ANTLR不要使用令牌

我怎样才能告诉Antlr不要使用代币,而只是跳过它,然后再回来呢? 我试图评估Haskell式的列表构建,并打印新形成的列表 前任:[2x+3 | x我已经有几年没有使用ANTLR了,但据我所知,ANTLR操作允许您将中间结果存储在变量中,并在以后引用它们。在这种情况下,您可以将2x+3存储在某个中间变量中,然后在阅读list1后,您可以返回并计算从那时起存储的中间值现在您有了必要的上下文

ANTLR4书,计算器练习

我被antlr困在一个非常基本的层面上。正在阅读帕尔博士的“最终ANTLR 4参考”。在第4.2节“使用访客构建计算器”中,列出了以下语法: grammar LabeledExpr; // rename to distinguish from Expr.g4 prog: stat+ ; stat: expr NEWLINE # printExpr | ID '=' expr NEWLINE # assign | N

带参数的Antlr规则

我正在与ANTLR规则参数斗争。ANTLR版本是4.4 grammar A; DIGIT: [0-9]; s: val EOF; val: dval[1] | val '*' val; dval[int x]: '.'; ANTLR在以下情况下失败: error(50): :2:32: syntax error: '1' came as a complete surprise to me while looking for rule element /Users/parrt/antlr/c

ANTLR中的decf语法解析

我正在使用Antlr为DECAF创建一个解析器 语法脱咖啡因 //********* LEXER ****************** LETTER: ('a'..'z'|'A'..'Z') ; DIGIT : '0'..'9' ; ID : LETTER( LETTER | DIGIT)* ; NUM: DIGIT(DIGIT)* ; COMMENTS: '//' ~('\r' | '\n' )* -> channel(HIDDEN); WS : [ \t\r\n\f | ' '| '

注释Lexer规则的ANTLR3异常

我正在修改一个已经存在的ANTLR语法文件,以便能够解析特定的注释。目前存在一个Lexer规则来过滤隐藏通道的所有注释。规则如下所示: COMMENT : '//' .* ('\n' | '\r') {$channel = HIDDEN;}; 如果此规则为/@key,我想修改此规则以允许注释通过。我尝试使用否定语句,试图通过使用/~('@')来阻止/@key语句匹配,这似乎是可行的,但是还有其他/@标记,我想继续过滤到该语句允许通过的隐藏通道。在lexer中,如果一个输入可以匹配多个规则,则

是否可以从antlr4中的解析器定义的标签中检索列表?

以这个虚拟antlr4语法为例: grammar testingGrammar; @header{package gen;} dsopt_rename: 'rename' (OLDN=ID '=' NEWN=ID)+; ID: [a-zA-Z_]; 我的目标是java。我想得到两个列表:旧名字和新名字;可以这样做: @Override public DsOption visitDsopt_rename(Dsopt_renameContext ctx) { LinkedList

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