再见
如何构造一个简单的ANTLR语法来处理多行表达式,而不需要分号或反斜杠
我正在尝试为表达式编写一个简单的DSL:
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
总的来说,我希望我的应用程序为脚本提供一些初始命名值,并提取最
在上述场景中,“或”可以通过
表达式->二进制操作
或
EXPRESSION->UNARYOP->EXPRESSION->BINARYOP
有没有一种系统的方法来消除上述歧义?我认为消除语法中的歧义是一项无法自动解决的任务,因为如果选择哪一个选项是正确的,那就是一种“主观”选择
确定问题后,构建不同的替代树并添加新的生成规则以禁止无效的解析树
恐怕没有像删除左递归这样神奇的解决方案。。。也许我错了
在您的情况下,您可以定义
VARIABLE: ...
UNARYOP: 'not' Expres
标签: Antlr
antlr3ambiguity
几天来,我一直在尝试解析一些由文本和数字组成的文本(我在语法中称之为句子)
我有一个规则,需要解析以INT结尾的句子
sentence_with_int
: sentence INT;
所以,如果我有一些输入是“购买的14码鞋的数量是3”,那么句子_和_int将是匹配的,而不仅仅是句子。我相信有更好的方法可以做到这一点,但我只是在学习这个工具
谢谢你,Richard你的语法:
确实如此。这里有一个小测试线束:
import org.antlr.runtime.*;
我有一个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
标签: Antlr
grammarantlr3context-free-grammar
我尝试了以下方式报告错误
@members{
public String getErrorMessage(RecognitionException e,String[] tokenNames)
{
List stack=getRuleInvocationStack(e,this.getClass().getName());
String msg=null;
if(e instanceof NoViableAltException){
我想用antlr(目标C语言)编写一个程序,并将库(C运行时发行版)发送到包中,这样它就可以在其他机器上使用,而无需在该机器上安装antlr。我已在此链接上下载了此运行时的最新版本。谁能告诉我我能不能做到?干杯。我没有使用C目标,但使用了C目标。我想他们的工作方式也差不多
您需要将C运行时库与程序一起部署,因为生成的解析器和lexer将使用该库中的函数
您不需要安装Antlr本身,例如AntlrWorks或任何.jar文件是的,您可以静态链接它,但如何安装取决于您的平台。对于带有gcc或llvm
我希望以编程的方式将语法转换为字符串形式,并为其生成一个或多个字符串形式的Java。我想在内存中完成这一切,不涉及任何文件。我查看了org.antlr.Tool源代码,但我希望有更简单的方法来做我想要的事情,而不是重写没有文件的工具。有什么东西已经存在了吗
有什么东西已经存在了吗
不,一点也不。不在ANTLR的公共API中,也不在一些现有的第三方工具中
我正在尝试使用ANTLR将LALR语法转换为LL,但遇到了一些问题。到目前为止,我认为将表达式转换为自上而下的方法对我来说是很简单的。问题是当我将范围(1..10)和(1.0..10.0)包含在浮动中时
我试着使用这里找到的答案,但不知何故,我的代码甚至不能正确运行,更不用说解决一系列的浮点,即(float..float)。
附件是我的语法样本,只关注这个问题
grammar Test;
options {
language = Java;
output = AST;
}
pars
我有一个简单的lexer/语法,我一直在研究,我很难理解匹配格式化变量的标准操作过程。我正在尝试匹配以下内容:
变量名至少可包含1个字符。如果是一个字符,则必须是大写或小写字母
如果大于1个字符,则必须以任意大小写的字母开头,然后后跟任意数量的字符,包括数字、下划线和美元符号
我已经用多种方式重写了几次,但总是出现以下错误:
决策可以使用多个选项匹配输入,例如“单字母”:1、2
因此,该输入禁用了备选方案2“
我理解我的语法有一些歧义,但我有点困惑,为什么一旦我们进入最初的匹配循环,就可以匹配多
我正在编写一种类似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>
编辑:我更改了示例,以便更好地解释我想要得到的东西。
这是我的语法:
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 3中,您可以执行以下操作:
andExpression
: (andnotExpression -> andnotExpression)
(AND? a=andnotExpression -> ^(AndNode $andExpression $a))*
;
你知道如何在新版本中实现吗?ANTLR 4没有像ANTLR 3那样的重写操作符或output=AST选项。ANTLR 4解析器生成的树是解析树,其形状由语法规则隐式定义
我有规则:
expression
: //...
| expression (relative_operator expression)+
| //...
;
理想情况下,当我输入1=1=1时,它将生成表达式(1,=,1,=,1)树。然而,实际上它会生成表达式(1,=,表达式(1,=,1))。这是因为它更喜欢递归解析,而不是一行解析。是否可以明确地告诉规则它不能在自身上递归,或者在尝试在自身上递归之前,它应该遵循+/*
可以显式地告诉规则它不能在自身上递归,或者在尝试在
我递归地遍历antlr解析树,我想编辑树中TerminalNodes的文本。我希望能够为任何ParseTree做到这一点,并且我不希望为可能遇到的每个ParseTree编写特定的访问者
我查看了权威的ANTLR4参考,发现antlr对树重写没有任何直接支持。我正在寻找任何可能的解决办法或替代方案
private void editTree(ParseTree tree){
for(int i = 0; i < tree.getChildCount();i++){
我有下面的一段语法
prod:(ID在中)?子规则(逗号(ID中)?子规则)*
ID、IN和COMMA是标记终端,prod规则生成一个子规则表达式列表
我用C++运行时使用访问者模式,现在我遇到了以下问题。
如何找出ID令牌属于哪个子规则?调用ID()方法允许我请求特定的第k个ID令牌,但它不必对应于第k个子规则。我想澄清这一点。下面是一个令牌流示例
subrule COMMA subrule COMMA
ID IN subrule COMMA
如果我在子规则向量上迭代,没有对应的并行ID迭
我的语法如下:
grammar Expr;
expr : '-' expr # unaryOpExpr
| expr ('*'|'/'|'%') expr # mulDivModuloExpr
| expr ('+'|'-') expr # addSubExpr
| '(' expr ')
是否存在成熟的ANTLR D靶点(或至少未被归类为α靶点)?也许有一些现有sourceforge托管目标的良好工作示例在使用中
是否存在成熟的ANTLR D靶点(或至少未被归类为α靶点)
假设你的意思是被归类为阿尔法,那么不,没有。至少,据我所知不是这样,我一直密切关注着ANTLR邮件列表。现在被归类为Beta版。
这里也有一个例子
我正在尝试用ANTLR解析值。以下是我语法的相关部分:
root : IDENTIFIER | SELF | literal | constructor | call | indexer;
hierarchy : root (SUB^ (IDENTIFIER | call | indexer))*;
factor : hierarchy ((MULT^ | DIV^ | MODULO^) hierarchy)*;
sum : factor ((PLUS^ | MINUS^) factor
有没有办法指定允许以下语法的语法:
f(x)(g, (1-(-2))*3, 1+2*3)[0]
转换为(在伪lisp中显示顺序):
以及有限运算符优先级等
以下语法适用于backtrack=true,但我希望避免这种情况:
grammar T;
options {
output=AST;
backtrack=true;
memoize=true;
}
tokens {
CALL;
INDEX;
LOOKUP;
}
prog: (expr '\n')* ;
expr
我在Antlr3.4中编写了一个PHP5解析器,它几乎已经准备就绪,但我无法处理PHP的一个棘手特性。我的问题是赋值运算符的优先级。在PHP手册中,赋值的优先级几乎位于列表的末尾。列表中只有and、xor或and在后面
但手册页面上有一条说明:
尽管=的优先级低于大多数其他运算符,但PHP将
仍然允许类似以下表达式:if$a=foo,in
在这种情况下,foo的返回值被转换为$a
注释中的小示例对我的解析器来说不是问题,我可以在assignment规则中将其作为特例处理
但还有更复杂的代码,例如
我的语法如下:
grammar BirdGrammar;
lines: (init '\n')*;
init : lineCode
| continuation;
sep : ' '
| '-'
;
lineCode : interfaceList
| protocolList
| interfaceAddress
| interfaceFlags
;
interfaceL
我仍在尝试使用ANTLR解析一个简单的Javadoc样式的格式。基本上,格式如下所示:
/**
* Description
*
* @name someId
*/
我的语法分析器如下:
query_doc : BEGIN_QDOC description name NOMANSLAND* END_QDOC;
description : (DESCRIPTION_TEXT | NOMANSLAND)*;
name : OPEN_N
我的脚本语言包含一系列宏,规则定义如下
program
: macrodeclaration* EOF
;
macrodeclaration
: (STATIC)? 'MACRO' STRING declareparameter
statement*
'ENDMACRO'
;
有时我将endmacro错误地键入为endmacros,解析器会吞噬标记“endmacros”,忽略下一个宏定义,继续搜索下一个endmacros。它吐出了那么多不可行的替代错误
我想知道如何调
我对这个解析器的消歧有问题。我想提一下
我正在使用antlrworks 1.4.3(我必须使用它,家庭作业)。我也不能使用backtrack=true
它应该匹配输入,比如
main Int a, Char b, MyClass c -> Int :
expr ';'
.
.
.
expr ';'
end';'
我还在“:”之后找到了解析器,因为这个问题不允许我生成代码
program
: classDef+ -> ^(PROGRAM cl
我的语法如下:
query
: IDENT 'x' NOT
;
WS : (' '| '\t'| EOL)+ { $channel=HIDDEN; };
NOT : ('N'|'n')('O'|'o')('T'|'t');
fragment
EOL : '\n' | '\r';
fragment
DIGIT : '0'..'9';
fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
IDENT : LETTER ( LETTER
我正在尝试使用Antlr4.5为SQL语法生成一个lexer/解析器(在C#中)。为了编写语法和测试语法,你会推荐什么样的工具
我正在尝试antlrworks2,但我发现它有点混乱(找不到输入示例文本并查看解析树的方法-不确定它是否不在那里,或者我是瞎子,或者干脆是哑巴,但我非常确定antlrworks v1有这样一个功能)
Sam Harwell的Visual Studio VSIX插件看起来很棒,但它也让我感到困惑,词法分析器和解析器是在obj\文件夹中生成的,而不是在项目中生成的。此外,在
我已经为DSL构建了一个语法,我想用一些颜色显示一些元素(表名)。我从Java输出HTML
columnIdentifier :
columnName=Identifier
| tableName=Identifier '.' columnName=Identifier
;
Identifier : Letter LetterOrDigit* ;
fragment Letter : [a-zA-Z_];
fragment LetterOrDigit : [a-zA-
我在lexer中有如下注释规则
星形斜杠:'/*'
多元素:STARSLASH(选项{greedy=false;}:)'*/'
SINGLELINECOMMENT:'/'~('\n')*
现在我必须编写另一个lexer规则,它以“/”开头,以“/”结尾。当我按照下面的方式写这个规则时,我得到了一个错误
斜杠规则:'/'(选项{greedy=false;}:.)*'/'
我使用的是ANTLR3.2。如何编写此规则斜杠规则?多元素:'/*'(选项{贪婪=错误;}:)'*/';在发布问题时,我给出了“
我试图检测赋值的右侧是否是一个可能的十六进制值,而不是另一个变量引用。比如说
myvariable = 2
a = 4
/* the c reference does not exist therefore the user may mean hex C
add in a quickfix to change to 0xc
*/
b = c
/* The user most probably means a hex number therefore add in a quickfix for
我在Antlr中发现了以下语法:
->语法的作用是什么
它叫什么,我可以用谷歌搜索它来阅读它
“Antlr4最终指南”只有一页关于它的内容。它指的是“lexer命令”,但它从未命名运算符。本书中的用法与bash解析器中的用法不同。在ANTLR3中,->用于解析器规则,表示a,ANTLR4中不再支持该用法
在ANTLR4中,->用于lexer规则,与旧的v3功能无关。第281页的“ANTLR4最终指南”将其称为lexer命令的一部分。请在你的答复中说明这一点。
file_descriptor
我试图从几千个库的setup.py中提取setup\u requires和test\u requires值。我有这本语法书
grammar SetupPy ;
file_input: (ignore setupRequires | ignore testRequires )* EOF;
setupRequires : SETUPDEC '[' dependencyValue* (',' dependencyValue)* ']';
testRequires : TESTDEC '[' de
我有以下解析器规则:
defDirective : defType whiteSpace letterSpec (whiteSpace? COMMA whiteSpace? letterSpec)*;
defType :
DEFBOOL | DEFBYTE | DEFINT | DEFLNG | DEFLNGLNG | DEFLNGPTR | DEFCUR |
DEFSNG | DEFDBL | DEFDATE |
DEFSTR | DEFOBJ
我有以下ANTLR语法:
grammar mygrammar;
ASSIGNMENT
: ID '=' INT
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : '0'..'9'+
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HI
我正在用ANTLR for D实现一个解析器。这种语言基于C语言,因此声明和表达式之间存在一些歧义。考虑这一点:
a* b = c; // This is a declaration of the variable d with a pointer-to-a type.
c = a * b; // as an expression is a multiplication.
由于第二个示例只能出现在赋值表达式的右侧,因此我尝试使用以下代码段解决此问题:
expression
: left =
标签: Antlr
antlr3antlrworks
我正在使用可用的Objective C语法,并尝试解析以下代码:
int main()
{
int k=0;
}
这是一个目标c代码,应该对其进行解析,但是当我调用函数translation_单元时,它给了我以下错误。
错误包括:
line 1:0 no viable alternative at character 'main'
line 1:0 no viable alternative at character '('
line 1:0 no viable alternat
我是一个ANTLR新手,正在尝试将早期的ANTLR 3.1语法更新为3.4。我遇到的一个绊脚石是我生成的解析器。有一行代码调用NextNode(),我希望它调用NextTree(),这样我的解析器就会执行所需的行为
我所讨论的ANTLR表达式是:
cast : ('(' ssisType (',' INT)* ')') term -> ^(CAST ^( ssisType INT*) term)
;
SSIS类型定义为:
ssisType
:
( typeCode =
在ANTLR 3中,您可以执行以下操作:
andExpression
: (andnotExpression -> andnotExpression)
(AND? a=andnotExpression -> ^(AndNode $andExpression $a))*
;
你知道如何在新版本中实现吗?ANTLR 4没有像ANTLR 3那样的重写操作符或output=AST选项。ANTLR 4解析器生成的树是解析树,其形状由语法规则隐式定义
我正在尝试为unicode兼容的标识符编写ANTLR 4令牌规则。在我看来,java.lang.Character中有标识符开始字符和标识符继续字符的概念;是否有与这些概念相对应的内置ANTLR 4字符类?我已为“isUnicode身份识别器开始”的源代码添加了灰色,但未成功。否,ANTLR 4集合文字不支持正则表达式之类的字符类。否,ANTLR 4集合文字不支持正则表达式之类的字符类。嗯。。。我想我问的是一个稍微不同的问题,但你可能已经回答了。我不是在寻找正则表达式本身,只是在寻找一个内置常量
我有一个yacc语法,我想转换成ANTLR。有野牛去吗
ANTLR转换器可用吗?有人能帮忙吗
谢谢,
Prasanth让我们比较一下这些解析器生成器:
ANTLR v4是一个ALL(*)解析器生成器,是
Yacc是一个解析器生成器
Bison是一个语法分析器生成器
LL和LALR是:
LALR(k)语法分析器与LL(k)语法分析器是不可比拟的:对于大于0的任何j和k,存在不是LL(k)语法的LALR(j)语法,反之亦然。事实上,对于任何k>0,给定的LL(1)语法是否为LALR(k)是不可判
我拼凑了一些代码来测试lexer/parser语法,但我一直在研究如何创建适当的文件输入/流对象来解析文件。我的代码如下所示,我得到了一个关于给BasicLexer类构造函数一个AntlInputStream而不是CharStream的错误,以及一个与给BasicParser一个CommonTokenStream类似的消息(它需要TokenStream)。你知道我哪里出错了吗
public static void main(String[] args) throws Exception {
是否有一种机制将值传递给lexer?(我正在与ANTLR 3中的C target合作)
其他一些搜索结果建议将函数和var放入成员区域:
@members
{
bool read_flag;
void set_flag(bool b) {read_flag = b;}
}
然而,这似乎不起作用。set_flag()是lexer的全局函数,但不能从外部调用
我希望能够在调用代码中执行以下操作:
//some input stream
pANTLR3_INPUT_STREAM in
如何检测解析器以编程方式生成的错误?例如,根据以下语法:
s : 'hello' ;
这个程序输入:“foo-bar”
解析器将打印出“第1:0行不匹配的输入'foo'应为'hello'”。有没有一种方法可以通过编程检测解析失败?它似乎不会引发任何类型的异常。实现AntlErrorListener接口并将其添加到解析器:
Parser#addErrorListener(ANTLRErrorListener);
通常,要首先删除默认控制台输出侦听器:
Parser#remo
我正在尝试解析Windows头文件以提取函数原型。Microsoft成为Microsoft意味着函数原型不是常规的、易于解析的格式。通常,但并非总是用微软的结构化注释语言来注释常规参数,该语言从以下划线开头和结尾的标识符开始,中间可能有下划线。SAL标识符后面可能有括号,并包含各种编译时检查,但我不关心SAL的内容。例程通常使用访问说明符进行注释,访问说明符通常类似于WINAPI、APIENTRY等,但可能不止一个。在某些情况下,参数也仅由其类型指定。嘘
我的语法是这样的:
//
// Pars
我刚刚开始使用ANTLR。我正在尝试为如下字段定义编写一个解析器:
field_name = value
例如:
is_true_true = yes;
我的语法是这样的:
但是当我在'working=yes;'上运行生成的解析器时我收到错误消息:
第1行:7外部输入“”应为'='
第1行:9外部输入“”应为单词
我不完全理解这一点,匹配单词-模式时是否有错误,或者完全是其他原因吗?您的示例中有空格,但您的字段定义没有说明原因。您的示例中有空格,但您的字段定义没有说明原因。因为通常情况下
我正试图用ANTLR构建一种新的语言,但我遇到了一个问题。我试图支持数字表达式和数字的数学运算(我认为这很重要),但解析器似乎并没有按照我的预期运行。这是我的语法:
grammar Lumos;
/*
* Parser Rules
*/
program : 'start' stat+ 'stop';
block : stat*
;
stat : assign
|
我正在使用ANTLR4生成的解析器处理一些JavaScript文件。我不知道如何从ANTLR AST树中分割想要的子树。例如,如何按如下方式对图片中红方块中的子树进行切片
ANTLR AST树的一个示例:
您有两个选项:编写一个解析树侦听器或访问者以访问这些节点;或者,编写一个XPath表达式来查找这些节点。注意,在Antlr运行时中有一个XPath表达式搜索,但它非常有限。
请参阅以下位置提供的源代码:
我定义了两个令牌:
ID : ('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')*;
PITCH
: (('A'|'a') '#'?)
| (('B'|'b') '#'?)
| (('C'|'c') '#'?);
显然,字母“A”是一个模棱两可的词
我进一步界定:
note : PITCH;
name : ID;
main
标签: Antlr
antlr3antlrworks
我想在一个简单的文本行中解析和读取一个闭包值,如下所示:
1!某事
line
: (NUMBER EXCLAMATION myText=~('\r\n')*)
{ myFunction($myText.text); }
NUMBER
: '0'..'9'+;
EXCLAMATION
: '!';
我在myText变量中得到的只是'something'的最后一个'g',因为正如在生成的代码中所看到的,myText在每次出现~('\r\n')时都会在whil
我需要将一个语法文件从antlr2语法重写为antlr4语法,并有以下问题
1) 巴特·基尔斯(Bart Kiers)表示,这里面有一个严格的顺序:语法、选项、标记、@header、@members。这不同意在选项之前声明标题。是否有资源说明antlr4的正确顺序(如果存在)
2) 同一篇antlr2.org文章指出:“语法的选项部分,如果指定,必须紧跟在类说明符的“;”之后:
class MyParser extends Parser;
options { k=2; }
但是,在使用antl
第85行是语句规则。我真的不知道为什么会失败。请帮忙
这是Antlr2 btw。是的,是的,超旧的,是的,是的
谢谢 对Antlr4玩得太多了:)在Antlr2中,我想令牌/规则必须包装在paren中才能应用*或+或…哈哈,太好了!这也可以解释为什么我在v3甚至v4语法中看到带括号的单标记:这些标记很可能是从v2语法移植而来的。谢谢Bart。更糟糕的是,我正在尝试支持我们使用Antlr 4所做的一些工作,以填充使用Antlr 2 lol的内容。因为您对Antlr非常了解,如果您有时间,您愿意看一
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 35 页