当输入文件在EOF处没有换行符或有多个换行符时,ANTLR会给出以下错误
第0行:-1个不匹配的输入“”,需要换行
如何考虑在输入文件末尾有多个或没有换行符的可能性。最好我能在语法中解释一下 规则:
parse
: (Token LineBreak)+ EOF
;
仅解析由一个换行符分隔的令牌流,以一个换行符结束
而规则:
parse
: Token (LineBreak+ Token)* LineBreak* EOF
;
解析由一个或多个换行符分隔的令牌流,以零、一个或
几天前,我在ANTLR邮件列表上发布了这个问题,但没有得到任何支持。所以我希望你们能帮助我:
我目前正试图深入研究Antlr,因为我发现这个工具非常有用。最后一次使用它时,我根据完成的语法生成了一些东西。
这次我想建立自己的语法,真正开始理解发生了什么
为此,我决定为一些Wiki符号(如文本)构建一个解析器
下面是一个示例(不带-Start-和-End-行):
如果文本包含“Lineup”块,则应对此进行分析。内容至少是一个“楼层”,后跟多个名称、一个新的“楼层”或结尾的“列队”
如果我将语法和
我检查了ANTLR中的异构树(使用ANTLRWorks 1.4.2)
下面是我在ANTLR中已经完成的示例
grammar test;
options {
language = java;
output = AST;
}
tokens {
PROGRAM;
VAR;
}
@members {
class Program extends CommonTree {
public Program(int ttype) {
023abc7defghij
标题
字符0,1=以下块的大小
大块
第一个字符=以下字符串的长度
以下字符=具有指定长度的字符串
示例结果
在上面的例子中,这意味着:
02->2下面的块
将跟随3->3个字符串
abc->三个字符串
7->7个字符串将紧跟其后
defghij->七个字符的字符串
问题:
我能写一个描述这种字符串形式的语法吗?
我需要解释“长度”信息,然后构建具有指定长度的标记,用长度信息和字符串填充对象
我希望我能把这个描述得通俗易懂。我找不到描述或解决我的问题的信息。我假设您
在这种情况下,如何解决相互递归性
value : comparison | 'A' | 'B' | 'C';
comparison : value comparison_operator value;
修正如下:
atom : variable | literal | call | constructor | (PARAM_START comparison PARAM_END);
comparison : (atom comparison_operator atom);
value :
有人知道一种工具,它可以从ANTLR生成EBNF吗?
ANTLR已经接近EBNF,但出于文档目的,我希望有一个干净的EBNF描述(中间没有代码)
使用antlrworks,这已经很好地获得了语法图:
java -cp antlrworks-1.1.4.jar org.antlr.works.Console -f yql.g -o output/ -sd eps
但它希望有一个简单的文本描述,最好是文本、tex、html、xml或类似的东西。我有一个将外来语法转换为W3C语法符号的工具。它有一个
我有一个实用方法,我在组合语法中的lexer和parser生成的代码中都使用它。除了将其移动到外部实用程序类之外,是否有某种方法可以消除复制/粘贴到成员和lexer::members,并在生成的lexer和解析器中发出此方法
我正在使用Antlr 3。。。我想如果在4中添加了一些新的内容,这也将是有用的信息。否,它被放置在解析器或词法分析器中(适用于v3和v4)。当然,如果可能的话,您可以将其设置为静态,这样就可以方便地从两者调用它
标签: Antlr
expressiongrammarabstract-syntax-tree
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他东西)。到目前为止,我有以下内容,但它们不能处理某些情况(成功/失败的情况出现在下面的代码块之后)。有人知道发生了什么吗
注意:varname+=和varname=只是XText中一些额外的AST生成帮助程序。现在不要为他们担心
...
NilExpression returns Expression:
'nil';
FalseExpression returns Expression:
'false';
TrueExpressi
标签: Antlr
text-parsingosloquery-expressions
问候
我正在从事一个项目,该项目要求我以文本形式编写查询,然后将它们转换为一些易于处理的节点,由一些Abigous存储库进行处理。在这里的所有内容中,我最不感兴趣的部分是将文本转换为节点的部分。我希望它已经在某处完成了
因为我边做边编,所以我选择使用LINQish表达式语法
从电影中的m中选择m.A、m.B
我开始手动解析它,并获得了一些基本知识,但它相当俗气。我在寻找更好的解决办法。我在使用MGrammar时取得了一些进展,但如果这样的东西已经存在,那就太好了。有人知道有什么东西已经这样做了吗
标签: Antlr
antlr3lexerparser-generator
我在隐藏通道中使用了正常的空格分隔,但是我有一个规则,我希望在后面的处理中包含任何空格,但是我发现的任何示例都需要一些非常奇怪的手动编码
没有一个简单的选项可以从多个通道读取,比如从一开始就把空白放在那里
这是空格lexer规则
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
这是我的规则,我想包括空格
raw : '{'? (~('{'))*;
基
我有一个非常简单的测试语法,如下所示:
grammar Test;
statement: expression EOF;
expression
: Identifier
| expression binary_op expression
| expression assignment_operator expression
| expression '.' Identifier
;
binary_op: '+
我将ANTLR V4与标准C语法文件一起使用。我正在使用C#,这是本书中的基本侦听器示例,并附加到EnterUnaryExpression事件
但有了这种投入:
myArray[1][2] = 10;
myArray[3][4] = 20;
myArray[5][6] = 30;
使用EnterUnaryExpression事件并输出context.GetText():
我似乎没有得到第一个数组事件,即在我的示例中,ismyArray[1][2]及其结果10。这是预期的结果还是我发现了问题
我知道WS表示空白,但是SEA在antlr语法中的SEA的完整形式是什么
SEA_WS : (' '|'\t'|'\r'? '\n')+;
这可能与“海”与“岛”解析模式有关:
简而言之:在解析大括号分隔的表达式时使用的隐喻,岛是分隔符之间的标记,海是其他一切
在我的语法中,我使用:
WS: [ \t\r\n]+ -> skip;
当我将此更改为使用隐藏通道时:
WS: [ \t\r\n]+ -> channel(HIDDEN);
我收到使用“跳过”时未收到的错误(无关输入“”…)。
我认为,对于传递给解析器的内容,跳转和发送到通道并没有什么不同
您可以在下面找到执行解析器的代码摘录:
CharStream charStream = new ANTLRInputStream(formulaString);
Formula
后续问题:
1.我用了一条规则
COMMENT:START_1_TAG START_COMMENT END_1_TAG.*?开始标记结束注释结束标记->跳过
使用我的lexer跳过任何评论。
但是,当我在标记中留出任何空间时,我会得到一个不匹配的输入
我的Lexer的相关部分是:
lexer grammar DemoLexer;
START_1_TAG : '<%' -> pushMode(IN_TAG);
START_2_TAG : '<<' -> pushMo
我的侦听器中有一个exitXXX函数,它如何知道匹配了哪些规则。在exitEffectiveAddress16()中,我如何知道它与“BX'+'DI”或“BP'+'SI”匹配
谢谢Peter您需要为您的规则备选方案添加标签,以获得特定性。ANTLR语法语言提供了替代标签,它看起来像python注释,如下所示:
effectiveAddress16 : 'byte [' (BX '+' SI # effAddBXSI
| BX '+' DI
我是ANTLR的新手,学习了语法和工具的基础知识。
我试图在example.txt中解析一个简单的CPP源代码,它是:
int glob = 0;
int main() {
return 0;
}
关于语法:
我尝试了grun CPP14 translationunit-gui
标签: Antlr
visitorvisitor-pattern
我正在用ANTLR为一个旧的专有报告规范编写一个解析器,目前我正在尝试实现一个生成的解析树的访问者,扩展自动生成的抽象visito类
我对ANTLR和visitor模式都没有什么经验,但如果我理解正确,visitor应该在整个数据结构上封装一个操作(在本例中是解析树),从而在每个Visit*方法之间共享相同的返回类型。
以Terence Parr的权威ANTLR 4参考书为例,要访问由解析算术表达式序列的语法生成的解析树,选择int返回类型感觉很自然,因为树的每个节点实际上都是算术运算的一部分,
我有下面的ANTLR4语法
grammar ExpressionGrammar;
parse: (expr)
;
expr: MIN expr
| expr ( MUL | DIV ) expr
| expr ( ADD | MIN ) expr
| NUM
| function
| '(' expr ')'
;
function : ID '(' arguments? ')';
arguments: expr ( ',' exp
我正在使用ANTLRWorks,并使用@header操作指定了我的java包:
@标题{package com.xxx.xxx.xxx.compiler}
但是,当我生成java代码时,它被生成到根src目录,而不是src/com/xxx/xxx/xxx/compiler。因此,它不能干净地编译
如何指定生成代码的正确目录?好的,原来这是一个相当愚蠢的问题。或者更确切地说,一旦你意识到,答案是显而易见的
源文件总是在与.g文件相同的目录中生成。因此,将.g文件放在包的目录结构的正确位置
我试图预处理一些旧游戏中的对话文件——吸血鬼化妆舞会:血统,如果你好奇的话——在一些数据文件的特定位置插入一些代码
我想使用Antlr来转换对话框文件,但是我的语法是不明确的,尽管格式非常简单
该格式允许NPC和PC以一系列行的形式进行对话:
{ TEXT } repeated (it varies, normally 13 but sometimes less)
其中一个标记尤其重要(示例中为第5个,但为第1个),因为它定义了该行是属于NPC还是属于PC。I上有“#”字符。但是,其他令牌可
在ANTLR 2上,注释语法如下所示
// Single-line comments
SL_COMMENT
: (options {warnWhenFollowAmbig=false;}
: '--'( { LA(2)!='-' }? '-' | ~('-'|'\n'|'\r'))* ( (('\r')? '\n') { newline(); }| '--') )
{$setType(Token.SKIP); }
;
但是,当将其移植到
标签: Antlr
antlr3antlrv3ide
我有以下ANTLR语法:
grammar Tasks;
options {
language = Java;
}
tokens {
TODO = 'TODO';
}
plan : block;
block: '(' TODO ( TODO | block )* ')';
WS : ( ' ' | '\t' | '\r' | '\n' | '\v' ) { $channel = HIDDEN; } ;
I和以下字符串:
(TODO(TODO TODO(TODO)TODO)
我试图在我的ParserVisitor(访问antlr生成的解析树)中获取更多特定错误消息的行号。然而,我在这个类中拥有的只是上下文ctx,我可以做类似ctx.getText()的事情,但不能做getLine()。有办法做到这一点吗
这里可以使用ctx.getPayload()吗?如果是,怎么做
编辑:我正在使用Antlr4创建java文件
尝试使用以下方法访问访问者中的行号:
@Override
public Type visitStatAssign(@NotNull BasicParser
我的语法如下:
grammar Token;
prog: (expr NL?)+ EOF;
expr: '[' type ']';
type : typeid ':' value;
typeid : 'TXT' | 'ENC' | 'USR';
value: Text | INT;
INT : '0' | [1-9] [0-9]*;
//WS : [ \t]+;
WS : [ \t\n\r]+ -> skip ;
NL: '\r'? '\n';
Text : ~[
我有以下ANTL3语法(仅相关部分):
我需要一些原因,最好不解释重写如下
from_list
: from_list_elt
| from_list_elt (COMMA from_list_elt)+
;
我希望这是相等的。然而,第一种语法所接受的东西却被第二种语法所拒绝。这是为什么
我的选择:
options {
language=Java;
backtrack=true;
memoize=true;
output=AST;
}
特别是当我使用3个或更多符号时
datatype:
Integer | Float | Char | Blah | Blah
entity:
Class | Struct | Enumeration | Union
完整的语法可以在这里找到:问题是你的语法模棱两可
以这个模型为例
Bla;
Blubb;
Pling;
这些位|指针|标签|入口|逻辑| HwordLogicals |字节会出现什么错误?你能分享一个小的可复制的Xtext语法吗?你的语法不是独立的,看起来是假的
我是ANTLR4新手,我正在尝试以一种简单的形式可视化文本输入的解析树:
grammar Expr;
contract: (I WS SEND WS quantity WS asset WS TO WS beneficiary WS ON WS send_date WS)*;
asset: '$'| 'TND' | 'USD';
quantity:Q;
beneficiary: B;
send_date : day SLASH month SLASH year;
day: D ;
month:
我正在尝试为OracleQ引用字符串机制实现一个lexer规则,其中我们有Q'$somestring$'
在这里,除了空格,(,{,[,type(QUOTED_LITERAL))之外,您可以用任何字符代替$;
Q_引用文字_非终止:
Q QUOTE~[({[不确定为什么没有调用{…}操作,但它不是必需的。下面的语法对我很有用(将谓词放在前面!)
语法测试;
@lexer::成员{
布尔值IsValidendElimChar(){
return(_input.LA(1)=getText().cha
我有一个小AntlrV4语法,我正在实现一个访问者
假设它是一个简单的计算器,每个输入都必须以“;”结束
e、 g.x=4+5
如果我不把它放进去;最后,它也开始工作了,但最终我得到了一个输出
line 1:56 missing ';' at '<EOF>'
第1:56行缺少“;”在“
似乎它可以找到规则,或多或少忽略了丢失的终端“;”
我更喜欢一个严格的错误或异常,而不是这个软信息
输出由行生成
ParseTree树=parser.input()
有什么方法可以强化错误处理并检
ANTLR:有没有可能在内置词法器的情况下使用嵌入语法来生成语法
例如,在我的语言中,我能够使用嵌入式SQL语言:
var Query = [select * from table];
with Query do something ....;
使用ANTLR可能吗?是的,使用ANTLR它被称为孤岛语法。
您可以在island grammar文件夹中获得一个工作示例:它显示了语法在java代码中解析javadoc注释的用法
你也可以在文件里找到一些线索
有没有可能使语法与嵌入语法与它自己的词法
我有一段文字“关于某件事,诸如此类,诸如此类”
我想和“什么都可以”匹配
我的代币是
ON : ('O'|'o')('N'|'n');
INDEX: (options {greedy=false;}: ESC | .)*
WS :
( ' '
| '\t'
| '\r'
| '\n'
)+
{ $channel=HIDDEN; }
;
ESC :
'
标签: Antlr
grammarstringtemplatecode-translation
我正在尝试使用ANTLR+StringTemplate实现一个转换器。
我有一个类似java的起始语言和多目标语言
我举了一个例子:
我的目标语言之一需要全局声明所有变量。
我写了一个可以识别变量的语法,但在我的模板中找不到一个全局声明局部变量的方法
当然,如果我只有一个翻译,我就可以做到,但我有多个翻译,其中一些有局部和全局变量。
我想让它在特定的模板文件
例如,如果我能在模板中定义某种变量来保存所有变量声明的列表,并在我定义全局范围时使用它,那就太好了。。。但是我不知道这是否可行。解析器必须
标签: Antlr
conditional-compilation
我想知道如何评估ifdef。。。其他的end语句,可以放在代码中的任何位置。我从一个简单的例子开始,它实现了两个基本函数addp1,p2和diffp1,p2,其中p1和p2是字符串。它仅在p1和p2之间添加+或-in。这是我的语法:
grammar ifdef;
options {
language = Java;
output = AST;
ASTLabelType=CommonTree;
}
tokens
{
EQUAL = '=' ;
标签: Antlr
grammarantlr3antlrworks
我使用ANTLR创建语法,但我得到了这个错误
error(211): [fatal] rule conditions has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
我的语法规则:
conditions
我们从哪里开始手动从头构建CST?还是ANTLR4总是需要lex/parse过程作为我们的输入步骤?
我的程序中有一些表示代码结构的可视元素
e、 一个正方形代表一个类,而嵌入其中的一个圆圈代表一个方法
现在我想把它们转换成代码。在运行时(使用ANTLR4.js),如何使用ANTLR4来实现这一点?大多数ANTLR示例似乎都依赖于对现有代码进行词法分析和解析来获得语法树。因此,不是:
input code->lex->parse->syntax tree->output code(1)
我想要
我有一个要匹配的输入模式:
identifier=apple-packs/apple-packages-extension/albama_togo_air_extension
我在ANTLR4中的语法定义如下:
语法MyDSL
@lexer::members {
public static final int WHITESPACE = 1;
public static final int COMMENTS = 2;
}
locationReference
: ID '=
这是我的语法,我试着作为输入
alter table ;
一切都很好,但当我
altasder table; alter table ;
它在第一个字符串上给出了一个错误,但我想解析第二个命令,忽略第一个'altasder表'
grammar Hello;
start : compilation;
compilation : sql*;
sql : altercommand;
altercommand : ALTER TABLE SEMICOLON;
ALTER: 'alter';
TAB
在grammars-v4存储库()中可以找到的ANTLRv4语法中,可选规则ebnfSuffix是:
有时使用ebnfSuffix?进行匹配,请参见lexerElement
有时使用(ebnfSuffix |)匹配,请参见元素
我确实在问自己,在这里也是,这两个词是否有稍微不同的含义
grammars-v4存储库中有另一个关于beginBatch的相同两种模式的示例,所使用的规则具有可选元素或与空替代项一起使用
编辑:我在这里添加了我所指语法的建议部分:
lexerElement
:
下面ANTLR语法中的“expr”规则显然是相互左递归的。作为一名ANTLR新手,我很难找到解决这个问题的方法。我在ANTLR参考书中读过“解决非LL(*)冲突”,但我仍然没有看到解决方案。有什么建议吗
LPAREN : ( '(' ) ;
RPAREN : ( ')' );
AND : ( 'AND' | '&' | 'EN' ) ;
OR : ( 'OR' | '|' | 'OF' );
NOT : ('-' | 'NOT' | 'NIET' );
WS : ( ' ' | '\t' |
当antlr v3.1根据此规则编译时,我收到一条警告
sentence
:
(CAPITAL_LETTERS_AND_NUMBERS | INT | ANY_WORD )
(
INT
| CAPITAL_LETTERS_AND_NUMBERS
| ANY_WORD
)*;
警告是:
5:2: Decision can match input such as "CAPITAL_LETTERS_AND_NUMBERS" using multiple alternatives: 1
我想解析一种语言,其中语句由EOL分隔。我在lexer语法中尝试了这一点(从文档中的一个示例中复制):
然后在解析器语法中使用:
stmt_sequence : (stmt EOL)* ;
解析器拒绝了语句被一个或多个空行分隔的代码
然而,这是成功的:
EOL : '\r'? '\n' ;
stmt_sequence : (stmt EOL+)* ;
我是ANTLR的新手。看来两者都应该起作用。是否有关于贪婪/非灵巧lexer扫描的事情我不明白
我用3.2和3.4都试过了;我正在OSX10
我可能只是用错误的方式思考这个问题,但是以ruby为例,下面的方法是有效的
ree-1.8.7-2011.03 :004 > a =
ree-1.8.7-2011.03 :005 > 1
=> 1
但是,下面的代码会抛出一个错误
ree-1.8.7-2011.03 :006 > a sdlkfj
NameError: undefined local variable or method `sdlkfj' for #<Object:0x101986e88&g
我是antlr的新手,我编写了一个基本的组合语法来解析我的jsp文件。我正在使用antlrworks 1.4.3。。。在这里,我需要我的语法忽略文本的某些行,而不是显示
不匹配的异常错误
我该怎么办?我是否应该编写一个单独的规则来忽略几行不需要的代码
例如,有一些类似于:
<myTag: selectName = "SelectedLocation" html = "onChange=onChangeType('LOCATION', 'PLACE')"; uti
尝试(荣誉+=姓名|荣誉+=数字)+,然后$honor是一个令牌列表
我拿出了$honor
for(int r = 0; r < list_honor.size(); r++)
honorstr = honorstr + list_honor.get(r).text;
for(int r=0;r
我已经创建了一些lexer规则来匹配输入文件中的一些标记。我想在一行中消除输入文件中的所有其他字符(即,后跟换行符),而不是我之前创建的标记
所以,我在lexer中创建了这个规则
Newline : '\r'? '\n' | '\r';
...
My Own meaningful tokens
...
Others: (~Newline)* Newline;
但不知何故,这在lexer中造成了一种混淆,即与我自己的有意义的标记相匹配的标记。我能做些调整吗?你的问题中信息太少了。假设MU是您语言
目前,我的向量的语法就像是数字、字符串、向量和标识符的集合
vector:
'[' elements+=vector_members? (vector_delimiters elements+=vector_members)* ']'
;
vector_delimiters
:
','
;
vector_members:
NUMBER
| STRING
| vector
| ID
;
现在,有没有一种方法可以通过语法强制执行,使向量只能包含
基于此,我制定了如下规则:
ompParallel
locals [java.util.HashSet<String> names = new java.util.HashSet<String>();]
: SOME_LEXER_CONSTANT modifiers ;
modifiers
//Ensure that the full number of modifiers have been provided
: {$ompParallel::names.si
我已经开始使用ANTLR,并注意到它的lexer规则非常易变。下面是一个非常令人沮丧的例子:
grammar output;
test: FILEPATH NEWLINE TITLE ;
FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
此语法与以下内容不匹配:
c:\test.txt
x
我想创建一个lexer规则,它可以读取定义自己的分隔符的字符串文字(特别是Oracle引号分隔的字符串):
哪里有用作分隔符,但理论上可以是任何字符
有没有可能通过lexer规则来实现这一点,而不引入对给定语言目标的依赖
有没有可能通过lexer规则来实现这一点,而不引入对给定语言目标的依赖
不,这样的事情需要依赖于目标的代码
如果您或阅读本问答的其他人想知道如何使用目标代码来实现这一点,下面是一个快速演示:
lexer语法;
@成员{
前置布尔值(字符串文本){
对于(int i=0;iq'(
1 2 3 4 5 6 ...
下一页 最后一页 共 34 页