ANTLR相当于野牛拒绝行动?

我正在尝试分析Name=Value对的列表,其中的值可以包含除空格以外的任何内容(即值可以包含等号)。 名称仅限于常用的标识符字符 问题是,“Value”标记匹配所有内容。例如,对于输入: dude=sweet 解析器将用一个“值”标记匹配整个输入(并抛出一个不匹配的TokenException) 在bison中,有可能将状态分配给令牌(或者这只是针对非终端?),这样它们只有在显式转换到该状态后才“有资格”匹配 想想看,这在bison中也不起作用-令牌拆分已经发生(在flex中);然而,我认为

ANTLR以任意顺序命名函数参数/参数

我一直在寻找一种在ANTLR中以任意顺序显示命名函数参数的方法。有人知道ANTLR解析器表达式中是否存在忽略顺序的语法吗 假设语言中有一个函数foo,它可以接受两个命名参数:x和y。由于它们是命名参数,我希望它们能够以任意顺序传递到函数中: foo(x=1, y=2) 以及 foo(y=2, x=1) 两者都应该是合法的 我可以列出ANTLR中的所有参数排列,但我希望会有一个更优雅的解决方案,特别是因为我有一些可以接受5个参数的函数 任何帮助都将不胜感激 我很确定ANTLR没有内置任何东西来

我可以在运行时添加Antlr令牌吗?

我的语言包含一些在构建时未知但在运行时已知的单词,因此需要不断地重新构建/重新部署程序以考虑新单词。我想知道在Antlr中是否可以从配置文件生成一些令牌 e、 在一个简化的例子中,如果我有一个规则 rule : WORDS+; WORDS : 'abc'; 我的语言在运行时遇到了“bcd”,我希望能够修改配置文件,将bcd定义为单词,而不必重新构建然后重新部署 您可以向lexer类添加某种集合。此集合将保存所有运行时单词。然后,在规则中添加一些可能与这些运行时单词匹配的自定义代码,并更改令牌

什么是;片段“;在ANTLR中是什么意思?

片段在ANTLR中是什么意思 这两条规则我都见过: fragment DIGIT : '0'..'9'; 及 区别是什么?片段在某种程度上类似于内联函数:它使语法更可读,更易于维护 片段永远不会被算作标记,它只用于简化语法 考虑: NUMBER: DIGITS | OCTAL_DIGITS | HEX_DIGITS; fragment DIGITS: '1'..'9' '0'..'9'*; fragment OCTAL_DIGITS: '0' '0'..'7'+; fragment HEX_D

ANTLR语法pred

我有以下ANTLR语法,Terrence Parr给出了一个例子 grammar b; backtrack : (cast ';')=> cast ';' | (e ';')=> e ';' | e '.' ; cast: '(' ID ')' ; e : '(' e ')' | ID ; ID : 'a'..'z'+ ; 然而,当我试图用回溯规则解释(a)时,我得到了一个不匹

当一个令牌是Antlr中另一个令牌的子集时,如何处理令牌?

我正在尝试将为未知工具开发的现有语法移植到Antlr。 语法中有一个用例,其中有两个标记,例如TEXT和TEXT_,但没有_a 语法中的一些规则应该只允许不带a的文本,但其他规则可以使用文本 我最初的尝试产生了以下语法,但问题是,当txt实际上是它的超集时,Antlr匹配更具体的语法规则(txtwa)。如果我输入类似“sometextwth”的不包含a的内容,Antlr不遵循text(txt)的规则预期输入为txt,提供的输入匹配为,但Antlr发现输入匹配txtwa,即使在语法上不预期,也选择

Antlr 根据上下文发出令牌

我正在使用Antlr2.7.4创建一个lexer。我被以下情况困住了: 如果冒号(“:”)后面跟有来自类C1的字符,则冒号标记应该在后面跟有标记C1 如果冒号后跟字符类C2中的字符,则冒号应作为C2的一部分,并应发出标记C2 假设类C1是{1,2,3},类C2是{A,B,C},那么:13应该标记为冒号,后跟C1。但是:AB应该标记为C2 更具体地说,我有一种语言的语法,它有两种结构: 标识符:Type//它有三个标记:IDENT冒号IDENT。类调用类型注释 ://这是一个标识符。有一类字

Antlr 将子树从AST的一部分移动到另一部分

我正在开发一个将Oracle SQL转换为ANSI SQL的工具。我有一个可以同时解析Oracle SQL和ANSI SQL的语法 我想从AST的where子句部分提取Oracle外部联接表达式,并在AST的from子句部分的末尾为匹配的select或子查询插入新的联接子句 具有重写规则的树解析器可以进行这种类型的树转换吗 i、 e.获取从Oracle SQL生成的AST SELECT a.columna, b.columnb FROM tablea a, tableb b WHER

如何编写语法或词法规则来描述ANTLR中的JSP/EL标识符或字符串文字?

如何编写语法或词法规则来描述ANTLR中的JSP/EL标识符或字符串文字?请记住,JSP/EL是Unicode,不能在规则中列出所有可能的符号。还要记住,字符串可能包含EL表达式,这可能很复杂,因此lexer不足以描述它们,需要解析器,而ANTLR解析器无法匹配字符类或任何字符。检查新的“词法模式”: 词汇模式 模式允许您按上下文对词汇规则进行分组,例如XML标记的内部和外部。这就像有多个次级执行器,一个用于上下文。lexer只能通过在当前模式下输入规则来返回匹配的令牌。lexer以所谓的默认模

编写ANTLR目标

在哪里讨论了为ANTLR创建新语言目标的过程?虽然由于可用目标的数量,这似乎是ANTLR3的一些常识,但我没有看到任何捆绑在源代码中的文档,也没有在Google中找到任何明显的位置 我希望找不到任何关于ANTLR4的此类文档,但我根本看不到任何文档。在撰写本文时,还没有关于如何创建新的ANTLR目标的指南。ANTLR4的联合作者、该书的作者山姆·哈威尔已经开始了,但还并没有完成 有兴趣编写新目标的人可以看看C#是如何实现的(当然还有原始Java目标)。但要意识到这绝不是一件小事 ANTLR 3和

分析EOF时ANTLR4出错

我是ANTLR(任何版本)的新手,我刚刚开始编写我的第一个语法文件。我将IntelliJ IDE与ANTLR插件(v1.6)一起使用 我的语法是 grammar TestGrammar; testfile : message+ EOF; message : timestamp WS id (NL | EOF); timestamp : NumericLiteral; id :

QBasic上有ANTLR吗?

我刚刚开始学习编译器设计。我有一个小任务要写QBasic语法。但是在ANTLR上只有很少的目标语言。在QBasic上可以吗?请任何人对此进行解释。我所知道的最大的ANTLR语法库位于。而且QBasic看起来并不在其中 我写过一两个语法/解释器,语法与BASIC类似,具有特定于域的扩展名(没有行号!),但看起来没有人在ANTLR4中使用QBasic,至少没有公开使用过

解析SQL';介于'之间;和';和';带有antlr4的表达式

我在使用SQL表达式解析器时遇到困难。具体来说,使用a和b以及a在c和d之间规则。备选方案规定如下: | lhs=exprRule K_AND rhs=exprRule # AndExpression | value=exprRule K_NOT? K_BETWEEN lower=exprRule K_AND upper=exprRule # BetweenExpression 不幸的是,此语法解析字符串,例如 ... l_discount BETWEEN 0.02 - 0.01 AND

Antlr 明确定义“的能力”;规则元素标签“;

下面是一种向规则上下文对象显式添加字段的方法 我的用例是一系列点和标识符: dotIdentifierSequence : identifier dotIdentifierSequenceContinuation* ; dotIdentifierSequenceContinuation : DOT identifier ; 通常我们需要处理dotIdentifierSequence结构的“完整路径”。Atm这意味着使用DotIdentifierSequence

ANTLR:如何摆脱';在'处缺少换行符&书信电报;EOF>'';?

我无法使用ANTLR正确识别“文件结尾”。只要在我得到的最后一个字符后没有新行,只有“文件结束” 第37行:1在“”处缺少换行符 关于如何正确处理文件结尾有什么想法吗 这是我的语法(用于GCode): 这是测试文件: % (Header) (Generated by gcodetools from Inkscape.) (Using default header. To add your own header create file "header" in the outpu

ANTLR运算符优先级被可选右递归破坏?

我对这种语法的行为感到困惑(在ANTLR 4.8中): 这是对书中一个例子的最小修改;我所做的只是在expr的第一个备选方案中添加一个?,这样*既可以是后缀一元运算符,也可以是二进制运算符 令我惊讶的是,这似乎打破了二进制运算符优先级的逻辑: expr: expr '*' expr #MulExpr | expr '+' expr #Addxpr | expr '*' #PointerExpr | '(' expr ')' #NestedExp

如何在ANTLR中构造干净的、类似Python的语法?

再见 如何构造一个简单的ANTLR语法来处理多行表达式,而不需要分号或反斜杠 我正在尝试为表达式编写一个简单的DSL: # sh style comments ThisValue = 1 ThatValue = ThisValue * 2 ThisOtherValue = (1 + 2 + ThisValue * ThatValue) YetAnotherValue = MAX(ThisOtherValue, ThatValue) 总的来说,我希望我的应用程序为脚本提供一些初始命名值,并提取最

ANTLR递归模糊问题

在上述场景中,“或”可以通过 表达式->二进制操作 或 EXPRESSION->UNARYOP->EXPRESSION->BINARYOP 有没有一种系统的方法来消除上述歧义?我认为消除语法中的歧义是一项无法自动解决的任务,因为如果选择哪一个选项是正确的,那就是一种“主观”选择 确定问题后,构建不同的替代树并添加新的生成规则以禁止无效的解析树 恐怕没有像删除左递归这样神奇的解决方案。。。也许我错了 在您的情况下,您可以定义 VARIABLE: ... UNARYOP: 'not' Expres

用Antlr解析歧义输入

几天来,我一直在尝试解析一些由文本和数字组成的文本(我在语法中称之为句子) 我有一个规则,需要解析以INT结尾的句子 sentence_with_int : sentence INT; 所以,如果我有一些输入是“购买的14码鞋的数量是3”,那么句子_和_int将是匹配的,而不仅仅是句子。我相信有更好的方法可以做到这一点,但我只是在学习这个工具 谢谢你,Richard你的语法: 确实如此。这里有一个小测试线束: import org.antlr.runtime.*;

在ANTLR中提取递归

我有一个ANTLR语法,不明白它是如何递归的。有没有办法让ANTLR显示它用来查看我的规则是递归的派生 整个递归语法: grammar DeadMG; options { language = C; } ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; INT : '0'..'9'+ ; FLOAT : ('0'..'9')+ '.' ('0'..'9')* EX

ANTLR3的错误处理问题

我尝试了以下方式报告错误 @members{ public String getErrorMessage(RecognitionException e,String[] tokenNames) { List stack=getRuleInvocationStack(e,this.getClass().getName()); String msg=null; if(e instanceof NoViableAltException){

与程序ANTLR一起构建C运行时

我想用antlr(目标C语言)编写一个程序,并将库(C运行时发行版)发送到包中,这样它就可以在其他机器上使用,而无需在该机器上安装antlr。我已在此链接上下载了此运行时的最新版本。谁能告诉我我能不能做到?干杯。我没有使用C目标,但使用了C目标。我想他们的工作方式也差不多 您需要将C运行时库与程序一起部署,因为生成的解析器和lexer将使用该库中的函数 您不需要安装Antlr本身,例如AntlrWorks或任何.jar文件是的,您可以静态链接它,但如何安装取决于您的平台。对于带有gcc或llvm

ANTLR中语法的简单编程生成和编译?

我希望以编程的方式将语法转换为字符串形式,并为其生成一个或多个字符串形式的Java。我想在内存中完成这一切,不涉及任何文件。我查看了org.antlr.Tool源代码,但我希望有更简单的方法来做我想要的事情,而不是重写没有文件的工具。有什么东西已经存在了吗 有什么东西已经存在了吗 不,一点也不。不在ANTLR的公共API中,也不在一些现有的第三方工具中

Antlr 在范围和语法错误中使用浮动?

我正在尝试使用ANTLR将LALR语法转换为LL,但遇到了一些问题。到目前为止,我认为将表达式转换为自上而下的方法对我来说是很简单的。问题是当我将范围(1..10)和(1.0..10.0)包含在浮动中时 我试着使用这里找到的答案,但不知何故,我的代码甚至不能正确运行,更不用说解决一系列的浮点,即(float..float)。 附件是我的语法样本,只关注这个问题 grammar Test; options { language = Java; output = AST; } pars

在ANTLR中捕获格式化变量声明

我有一个简单的lexer/语法,我一直在研究,我很难理解匹配格式化变量的标准操作过程。我正在尝试匹配以下内容: 变量名至少可包含1个字符。如果是一个字符,则必须是大写或小写字母 如果大于1个字符,则必须以任意大小写的字母开头,然后后跟任意数量的字符,包括数字、下划线和美元符号 我已经用多种方式重写了几次,但总是出现以下错误: 决策可以使用多个选项匹配输入,例如“单字母”:1、2 因此,该输入禁用了备选方案2“ 我理解我的语法有一些歧义,但我有点困惑,为什么一旦我们进入最初的匹配循环,就可以匹配多

Antlr xtext如何容忍解析错误?

我正在编写一种类似SQL的语言。假设正确的语法是 USE foo; SELECT * FROM bar; 但是我把它打到 US foo; SELECT * FROM bar; 默认行为是Antlr将停止解析,并且我丢失了语法高亮显示和大纲视图。 错误消息是“US”处缺少EOF。我将IParser重新绑定到RuntimeModule中的自定义解析器 @Override public Class<? extends org.eclipse.xtext.parser.IParser>

ANTLR中的语法和所选单词

编辑:我更改了示例,以便更好地解释我想要得到的东西。 这是我的语法: INTEGER : ' int '; LET : [a-z] ; cchar : LET | '-' | ' ' ; wor : cchar+; aaa : wor+ | wor* INTEGER wor* ; aaa是根。并写下“xx int xx int”。 我想得到一个结果:“x x int x x I n t”。只应捕获第一个int,下一个int不应给出“无关输入”错误,而应拆分为字母 如何修复它?这似乎可以按

ANTLR 4树注入/重写运算符

在ANTLR 3中,您可以执行以下操作: andExpression : (andnotExpression -> andnotExpression) (AND? a=andnotExpression -> ^(AndNode $andExpression $a))* ; 你知道如何在新版本中实现吗?ANTLR 4没有像ANTLR 3那样的重写操作符或output=AST选项。ANTLR 4解析器生成的树是解析树,其形状由语法规则隐式定义

Antlr 有可能不允许自递归吗?

我有规则: expression : //... | expression (relative_operator expression)+ | //... ; 理想情况下,当我输入1=1=1时,它将生成表达式(1,=,1,=,1)树。然而,实际上它会生成表达式(1,=,表达式(1,=,1))。这是因为它更喜欢递归解析,而不是一行解析。是否可以明确地告诉规则它不能在自身上递归,或者在尝试在自身上递归之前,它应该遵循+/* 可以显式地告诉规则它不能在自身上递归,或者在尝试在

有没有办法编辑Antlr ParseTree上的节点?

我递归地遍历antlr解析树,我想编辑树中TerminalNodes的文本。我希望能够为任何ParseTree做到这一点,并且我不希望为可能遇到的每个ParseTree编写特定的访问者 我查看了权威的ANTLR4参考,发现antlr对树重写没有任何直接支持。我正在寻找任何可能的解决办法或替代方案 private void editTree(ParseTree tree){ for(int i = 0; i < tree.getChildCount();i++){

使用c+中的访问者模式访问antlr4可选终端+;

我有下面的一段语法 prod:(ID在中)?子规则(逗号(ID中)?子规则)* ID、IN和COMMA是标记终端,prod规则生成一个子规则表达式列表 我用C++运行时使用访问者模式,现在我遇到了以下问题。 如何找出ID令牌属于哪个子规则?调用ID()方法允许我请求特定的第k个ID令牌,但它不必对应于第k个子规则。我想澄清这一点。下面是一个令牌流示例 subrule COMMA subrule COMMA ID IN subrule COMMA 如果我在子规则向量上迭代,没有对应的并行ID迭

“隐性”问题;及;使用Antlr在查询语法构建中

我一直在用ANTLR(C#)构建一个类似google的查询语法解析器 我已经完成了,除了一件事,我已经挣扎了很长时间,但没有解决 如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1、word2和word3”。因此实际上,“and”在术语之间是可选的/隐含的 我需要“and”来形成AST子树的根,如果“and”实际上不存在,那么这就不太好。即使使用了lookahead/backtrack,我也找不到正确的语法来实现它 下面是我当前语法的一个片段,它使用显式的“an

在ANTLR中,如何指定特定的重复次数?

我使用ANTLR指定一种文件格式,其中包含的行不能超过254个字符(不包括行尾)。如何在语法中对其进行编码,除了: line : CHAR? CHAR? CHAR? CHAR? ... (254 times) 这可以通过使用 首先,写语法的时候不要管你的行有多长。示例如下所示: grammar Test; parse : line* EOF ; line : Char+ (LineBreak | EOF) | LineBreak // empty line! ;

野牛的ANTLR语法

我想把一个语法从bison翻译成ANTLR。bison的语法本身非常简单,但我找不到一个简单的方法来实现这一点 野牛的语法: expr = expr or expr | expr and expr | (expr) 欢迎提供任何提示/链接/指针 谢谢, Iulian在ANTLR中,不能创建左递归规则: a : a b ; 尾部递归很好: a : b a ; 有关左递归规则的详细信息,请参阅 因此,您的示例可以如下所示: parse : expr+ EOF ; expr

ANTLR:如何使用python生成lexer和解析器?

我看过python运行时模块,但不确定是否要创建python解析器和lexer文件。我已经编写了.g文件。以下是步骤: 写语法 运行ANTLR生成lexer/parser类 编译并运行Python源文件,了解如何操作 要完成任何有用的工作,您必须将代码放入AST中,然后遍历树。是你干的吗?你得到了什么 这是一个例子。它包括Python3。语法比较如何?感谢您的回答,我刚刚意识到您必须使用java=”生成语法分析器。=“我非常感谢您投票并接受答案,而不是您的感谢。@duffymo是否可以在代码中生

生成更可读的antlr解析器

是否有一个选项可以生成更可读的antlr解析器。比如说,要禁用Token->DFA优化?您是否试图构建解析器的框架,以便将来手动维护它?从一开始就手工编写代码会是一个更好的选择吗?一个动机是可调试性,另一个动机是简单性:而不是让此代码匹配第一次出现的'once'//Exp.g:66:2:('once'条件('then')?操作)int alt13=4;alt13=dfa13.预测(输入);switch(alt13){case 1://Exp.g:66:4:'once'条件('then')?操作{

替换ANTLR中的令牌

我想用ANTLR替换令牌 我尝试了使用TokenStream和replace,但没有成功 有什么建议吗 ANTLRStringStream in = new ANTLRStringStream(source); MyLexer lexer = new MyLexer(in); TokenRewriteStream tokens = new TokenRewriteStream(lexer); for(Object obj : tokens.getTokens()) {

Antlr 关于这个词的混淆是

我想问“是”这个词是不是一个保留字。这就是我为什么这么问。我试图为其创建解析器的语言是优先级语言。我有一个任务,看起来像这样: %VARIABLE IS STRING 使用Antlr解释器,我输入上面的语句,得到一个错误,指出 “失配异常” 如果我键入: %VARIABLE AND STRING 一切正常 我花了一些时间四处寻找解决方案,但到目前为止什么都没有 这是我语法的一部分: assignis : '%' IDENT logical_operator types ;

Antlr 构建C目标语法分析器,需要知道编译时如何包含

我正试图在Windows7平台上用antlrIDE构建一个解析器(用C语言)。我完成了语法(.g of combined grammar),它会自动为我生成lexer和parser。但是,我不知道如何编译.c和.h文件。我尝试了,但得到了错误,因为头包含(antlrIDE在解析器的点c文件中自动生成头#include“antlr.h”)。我读过这篇文章 但这对我没有帮助,你们能告诉我怎么做吗?感谢您的高级支持。您需要将ANTLR运行时添加到您的项目/解决方案中。以下是下载运行库的链接(来自您在问

Antlr XText:如何为多目标语言创建解析器

我在XText中定义了我的DSL,它自动生成了Java版本的语言解析器和代码生成框架,这非常酷 问题是,我的DSL计划由使用多种语言实现的项目使用。您可以想象,我们可能至少需要在C#、Java和Ruby中解析DSL 所以问题是:有没有一种方法可以在xtext的帮助下为多种语言生成解析器 纯解析的东西只是整个Xtext套件的一小部分。集成到EclipseIDE和Xtend生成器中是两大块代码。Xtext构建在EMF-Ecore模型之上。这些部件都没有其他语言版本 因此,在普通C#和Ruby中运行X

Antlr 左递归在哪里?

下面是ANTLR语法的一个片段,它运行良好 它旨在成为一个tex解析器 如果我通过取消注释|text来修改规则的所有位置,则ANTLR会在规则escSeq 我觉得这很有趣。 我找不到左递归:要么我是瞎子,要么我误解了什么是左递归 有什么建议吗 afterNewline : (everywhere | par ); par : EoL {System.out.println("<PAR>");} afterNewline ; everywhere : (Esc escSeq //|

COBOL的ANTLR语法标识符

我正在为COBOL语言编写语法,我制定了一个规则来识别COBOL中的单词。 我的标识符规则是 IDENTIFIER : [a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*; 它在大多数情况下都可以正常工作,但是当我测试以下输入时 0000主程序 那么它就不起作用了。 请分享你宝贵的想法,让我变得正确。我怎样才能解决这个问题 根据,如果连字符是第一个或最后一个,则应将其视为字符而不是范围运算符。这可能不适用于ANTLR4类似正则表达式的lexer令牌定义 另外,您提出的COBO

Antlr 错误的AST选择

给定以下ANTLR v3语法: tokens { OPTION; UNKNOWN; } statement : my_statement | UNKNOWN_KEYWORD -> ^(UNKNOWN) ; my_statement : FIRST SECOND type = THIRD? -> ^(OPTION $type?); FIRST : 'my'; SECOND : 'keyword'; THIRD: 'best

Antlr:识别日期和数字的最简单方法?

在同一语法中解析有效日期和数字的最简单(最短、最少规则和无警告)方法是什么?我的问题是,匹配有效月份(1-12)的lexer规则将匹配1-12的任何事件。因此,如果我只想匹配一个数字,我需要一个解析规则,如: number: (MONTH|INT); 当我为日和年添加lexer规则时,它只会变得更复杂。我想要一个日期解析规则,如下所示: date: month '/' day ( '/' year )? -> ^('DATE' year month day); date: month=

Antlr4覆盖Lexer的文本

我知道我可以通过多种方式(侦听器或访问者)重写(解析器)规则的文本 但是,我想处理一些特定词汇匹配的文本(Lexer规则) 假设我们使用java语法。我们有一个完整的关键字列表: ABSTRACT : 'abstract'; ASSERT : 'assert'; BOOLEAN : 'boolean'; BREAK : 'break'; // 50 more or so... 这是一个采样输入: public \t\t\t\t class Y

删除ANTLR中的左递归?

我想知道如何修复此错误 以下规则集是相互左递归的[类型,数组类型] 目标是实现以下目标: (数组类型)类型->类型[expr] 应包含在类型参数中的。任何帮助都将不胜感激 以下代码: // Types type : atomic_type | named_type | pointer_type | record_type | enclosed_type | array_type ; atomic_type : VOID | CHAR | INTEGER

ANTLR4直接向解析树添加一个节点

我不熟悉ANTLR并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器 有没有办法从解析器或词法分析器直接向AST添加节点(带有一些文本)? 我将注释隐藏在我的Lexer中,并希望将其直接添加到树中 可能吗?我相信Less4j允许类似的事情 有没有办法从解析器或词法分析器直接向AST添加节点(带有一些文本) 不是来自lexer:在那个阶段还没有解析树 从解析器中,您可以这样做,但是没有ANTLR API可以这样做。ANTLR为您提供解析树,就像它解析您的输入一样。它不允

  1    2   3   4   5   6  ... 下一页 最后一页 共 19 页