我的问题是关于在ANTLRWorks中运行以下语法:
INT :('0'..'9')+;
SEMICOLON: ';';
NEWLINE: ('\r\n'|'\n'|'\r');
STMTEND: (SEMICOLON (NEWLINE)*|NEWLINE+);
statement
: STMTEND
| INT STMTEND
;
program: statement+;
Run Code Online (Sandbox Code Playgroud)
无论选择哪个换行NL(CR / LF / CRLF)或整数,我都可以通过以下输入(以程序作为开始规则)获得以下结果:
“; NL ”或“ 32; NL ”解析没有错误。“;” 或“ 45;” (不包含换行符)将导致EarlyExitException。“ NL ”本身解析没有错误。不带分号的“ 456 NL ”会导致MismatchedTokenException。
我想要的是一个语句以换行符,分号或分号后接换行符来终止,并且我希望解析器在终止符上尽可能多地吃掉连续的换行符,因此“; NL NL NL NL ”只是一个终端,而不是四个或五个。另外,我希望文件结尾的情况也可以是有效的终止,但是我还不知道该怎么做。
那么,这有什么问题,如何使它在EOF终止呢?我对解析,ANTLR和EBNF完全陌生,并且在简单的计算器示例和参考之间的某个水平上,我没有发现太多要阅读的资料(我有The Definitive ANTLR Reference,但它确实是一个参考,前面有一个快速入门,我还没有在ANTLRWorks之外运行过,所以任何阅读建议(除了Wirth的1977 ACM论文)也将有所帮助。谢谢!
我想了解Jint是一个用C#编写的JavaScript Intrepreter是如何工作的.特别:
我想为一种简单的语言定义语法.
该语言允许某种分配.
例
keyworda: this is the 1 keyword-A
keywordb: this is the second keywordb
...
Run Code Online (Sandbox Code Playgroud)
问题是,在关键字和':'任何char之后应该是可能的(关键字也是)
我尝试过很多东西,但我认为我仍然没有进入词法分析器和解析器思考...
我最后的想法失败了:
rule
: 'keyworda' ':' anychar* 'keywordb' ':' anychar* EOF
;
anychar
: .
;
NEWLINE
: ('\r'? '\n') {$channel=HIDDEN;}
;
Run Code Online (Sandbox Code Playgroud)
首先:谢谢你的回答!
我通读了手册并查看了scott stanchfield的教程.
问题是,我没有得到"anychar"的东西!
你是对的,我上面提到的语法错了,因为我很着急.
这是一个更好的尝试.问题仍然是,Tokenizer在定义ala中识别例如keyworda
keyworda : this is keyworda.
keywordb : this is another key!
...
Run Code Online (Sandbox Code Playgroud)
语法:
rule
: KEYA ':' STRING_LITERAL* NEWLINE
keybdefinition*
EOF
;
keybdefinition
: KEYB ':' STRING_LITERAL* NEWLINE
;
KEYA: 'keyworda';
KEYB:'keywordb'; …Run Code Online (Sandbox Code Playgroud) 我用antlr扭曲一个简单的语言,我在AntlrWorks中定义了一个Lexer语法,但是当我想生成java代码时,它给了我错误:
Antlr错误:以下令牌定义永远不能匹配,因为先前的令牌匹配相同的输入:FLOAT_OR_INT,OPEN_PAR,CLOSE_PAR,....(几乎适用于所有规则!)
我是antlr的新手,我认为这是因为规则位置的顺序,但我不知道他们应该怎么做,我的错误是什么?
这是语法:
lexer grammar OurCompiler;
options
{
k=5;
}
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
protected
INT : ('0'..'9')+
;
protected
FLOAT : INT '.' INT
;
FLOAT_OR_INT : ( INT '.' ) => FLOAT { $setType(FLOAT); }
| INT { $setType(INT); }
;
OPENPAR_OR_OUTPUT_OPERATOR : '(' { $setType(OPEN_PAR); } | '(' '(' { $setType(OUTPUT_OPERATOR); }
;
CLOSEPAR_OR_INPUT_OPERATOR : ')' { $setType(CLOSE_PAR); } | ')' ')' { $setType(INPUT_OPERATOR); }
;
protected
OPEN_PAR : '(' ;
protected
CLOSE_PAR : ')' …Run Code Online (Sandbox Code Playgroud) 我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以产生我需要的AST,但由于我是ANTLR的新手,我该如何让它显示?到目前为止我所做的是将语法文件与我现有的java语法放在一起.但我不知道如何从文件中使用和输出我需要的AST.我该怎么做?
我的规则是:
interfaceCommands
: descriptionCmd
ipAddressCmd
otherCmd
;
Run Code Online (Sandbox Code Playgroud)
虽然预期的顺序Cmds如语法中所述,但我也应该能够在这些顺序Cmds互换时接受输入.例如,在任何时候,ipAddressCmd可以在实际输入之前descriptionCmd或之后otherCmd.我的语法应如何修改以适应并能够解析这些无序输入?
我有一个ANTLR 4语法:
grammar Test;
start : NonZeroDigit '.' Digit Digit? EOF
;
DOT : '.' ;
PLUS : '+' ;
MINUS : '-' ;
COLON : ':' ;
COMMA : ',' ;
QUOTE : '\"' ;
EQUALS : '=' ;
SEMICOLON : ';' ;
UNDERLINE : '_' ;
BACKSLASH : '\\' ;
SINGLEQUOTE : '\'' ;
RESULT_TYPE_NONE : 'NONE' ;
RESULT_TYPE_RESULT : 'RESULT' ;
RESULT_TYPE_RESULT_SET : 'RESULT_SET' ;
TYPE_INT : 'Int' ;
TYPE_LONG : 'Long' ;
TYPE_BOOL : 'Bool' ; …Run Code Online (Sandbox Code Playgroud) 我最近开始使用ANTLR并发现了ANTLRWorks IDE.虽然编辑器工作正常,但是,当我运行测试装置时,它似乎停留在编译语法文件(或者更确切地说是编译语法没有做什么?),无论我给它什么输入.这是我得到的输出:
ANTLR Codegen
参数:[ - o,C:\ Users \\ AppData\Local\Temp\TestRigTask-1395567588803,-lib,C:\ Users \\ Desktop,-no-listener,-no-visitor,C:\ Users \\ Desktop\Test.g4]
ANTLR Testrig
编译语法文件......
以下是我给它测试问题的输入:
语法
grammar Test;
CUP : 'cup';
MUG : 'mug';
TEA : 'tea';
COFFE: 'coffe';
drinker : 'drinking a' holder 'of' liquid;
holder : MUG | CUP;
liquid : TEA | COFFE;
Run Code Online (Sandbox Code Playgroud)
测试文件
drinking a mug of coffe
Run Code Online (Sandbox Code Playgroud)
我做错了什么/错过了重要的事情吗?
我有问题用antlr v4生成我的语法定义:
grammar TagExpression;
expr : not expr
| expr and expr
| expr or expr
| '(' expr ')'
| tag
;
tag : [a-zA-Z]+ ;
and : '&' ;
or : '|' ;
not : '!' ;
WS : [ \t\n\r]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
语法错误发生在这里: tag : [a-zA-Z]+ ;
error(50): c:\temp\antlr\TagExpression.g4:10:6: syntax error: 'a-zA-Z' came as a complete surprise to me while matching alternative
Run Code Online (Sandbox Code Playgroud)
我看到的例子有非常相似的结构.知道为什么会这样吗?
谢谢
由于Antlr4是Antlr的新版本,这是我第一次使用它.我从eclipse市场下载了Antlr4插件.我制作了新的ANTLR 4项目,我得到了Hello.g4
后来我看到了这个小语法:
/**
* Define a grammar called Hello
*/
grammar Hello;
r : 'hello' ID ; // match keyword hello followed by an identifier
ID : [a-z]+ ; // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
Run Code Online (Sandbox Code Playgroud)
一旦它被保存,它是构建,我从Antlr控制台看到它,我想测试程序,但我不知道如何,我不知道如何制作一个可以由新编译的新文件语法?
在此先感谢您的帮助.
antlr ×10
antlr4 ×4
grammar ×3
antlrworks ×2
antlr3 ×1
antlrv3ide ×1
antlrworks2 ×1
c# ×1
eclipse ×1
interpreter ×1
java ×1
javascript ×1
jint ×1
keyword ×1
lexer ×1
tree ×1