我正在尝试从ANTLR开始。当我导入模块时antlr它工作得很好,但是如果我尝试导入MyGrammarLexer和MyGrammarParser,它表明 MyGrammarLexer 和 Parser 不在 lib 中。我使用 PyCharm ,安装了 ANTLR: pip3 install antlr4-python3-runtime我的代码是:
import sys
from antlr4 import *
import MyGrammarLexer
import MyGrammarParser
def main(argv):
input = FileStream(argv[1])
lexer = MyGrammarLexer(input)
stream = CommonTokenStream(lexer)
parser = MyGrammarParser(stream)
tree = parser.startRule()
if __name__ == '__main__':
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
也许谁知道为什么我无法导入 MyGrammarLexer 和 MyGrammarParser?请建议!反击:
/usr/bin/python3.6 /home/andrejka/PycharmProjects/Parser/parser.py
Traceback (most recent call last):
File "/home/andrejka/PycharmProjects/Parser/parser.py", line 2, in <module>
from antlr4 import *
File "/usr/lib/python3/dist-packages/antlr4/__init__.py", line 5, in <module> …Run Code Online (Sandbox Code Playgroud) getText() 返回完整的语句,不包括单词之间的空格。考虑空格的一种方法是将它们包含在语法中。但是,有没有其他方法可以获取考虑空格的完整字符串。
尝试创建部署包时出现以下错误。
"Copying file bin\Antlr3.Runtime.pdb to obj\Release\AspnetCompileMerge\Source\bin\Antlr3.Runtime.pdb failed. Could not find file 'bin\Antlr3.Runtime.pdb'"
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我发生了什么事以及如何解决它
应该如何解释这一规则
fragment LETTER_UPPERCASE : [\p{Lu}] ;
Run Code Online (Sandbox Code Playgroud)
在
https://github.com/okellogg/ada_antlr_grammar/blob/master/antlr4/ada.g4#L200
是\pANTLR 特定的转义序列吗?
我正在尝试使用ILMerge将一些可传递引用的程序集内化到我正在引用的程序集中,以消除与我的项目中的那些传递依赖项的冲突.
特别是,我引用了Antlr3.StringTemplate(以下简称AS,可在此处获取:http://www.stringtemplate.org/download.html).它引用了Antlr3.Runtime.Debug(ARD)和Antlr3.Runtime(AR).ARD本身也引用了AR.在ASCII艺术中,那是:
AS ---> ARD
\ |
\ v
\---> AR
Run Code Online (Sandbox Code Playgroud)
因为我正在使用的另一个程序集NHibernate 2.1依赖于不同的,不兼容的AR版本,我想使用ILMerge将AR合并并内化到AS中.从理论上讲,我认为这应该有效; 但是,我在执行理论时遇到了麻烦.
无论我尝试什么样的排列和选项,我最终都会遇到以下形式的错误:
ILMerge.Merge:程序集'Antlr3.Runtime.Debug'未正确合并.它仍然在目标程序集中列为外部引用.
我想用ILMerge完成的是什么?
在Antlr中,如果我有一个例子:
someRule : TOKENA TOKENB;
Run Code Online (Sandbox Code Playgroud)
它会接受:"tokena tokenb"
如果我希望TOKENA是可选的,我可以说,
someRule : TOKENA* TOKENB;
Run Code Online (Sandbox Code Playgroud)
那么我可以:"tokena tokenb"或"tokenb"或"tokena tokena tokenb"
但这也意味着它可以重复一次.无论如何我可以说这个令牌可以有1次或更少但不超过1次吗?所以它会接受:
"tokena tokenb"或"tokenb"但不是"tokena tokena tokenb"?
非常感谢
我会遇到这个问题:给出这个规则
defField: type VAR ( ',' VAR)* SEP ;
VAR : ('a'..'z'|'A'..'Z')+ ;
type: 'Number'|'String' ;
SEP : '\n'|';' ;
Run Code Online (Sandbox Code Playgroud)
我需要做的是将模板与规则"defField"相关联,该规则返回表示字段的xml-schema的字符串,即:
Number a,b,c ;-> "<xs:element name="a" type = "xs:Number"\>" ,also for b and c.
Run Code Online (Sandbox Code Playgroud)
我的问题出现在Kleene的*中,也就是说,如何根据'*'编写模板来执行上面描述的操作?
谢谢!!!
我正在尝试将Bart Kiers的ANTLR PCRE语法(参见:http://big-o.nl/apps/pcreparser/pcre/PCREParser.html)构建到JS目标.我得到它的唯一方法是使用全局回溯和memoization,它生成的代码在这里是无效的语法:
grammar PCRE;
options {
language=JavaScript;
backtrack=true;
memoize=true;
}
parse
: regexAtom* EOF
;
... and the rest of the grammar as seen: http://big-o.nl/apps/pcreparser/pcre/PCREParser.html
Run Code Online (Sandbox Code Playgroud)
词法分析器生成的代码如下所示:
//$ANTLR 3.4 PCRE.g 2011-11-19 23:22:35
var PCRELexer = function(input, state) {
// alternate constructor @todo
// public PCRELexer(CharStream input)
// public PCRELexer(CharStream input, RecognizerSharedState state) {
if (!state) {
state = new org.antlr.runtime.RecognizerSharedState();
}
(function(){
}).call(this);
PCRELexer.superclass.constructor.call(this, input, state);
};
org.antlr.lang.augmentObject(PCRELexer, {
: ,
: ,
: ,
: …Run Code Online (Sandbox Code Playgroud) 我正在研究一种具有两种当前"冲突"功能的DSL解析器:
123.4.ID[2..5](ID被定义为'a'..'z'+并且无关紧要.部分'[2..5]'最重要.应解析它的测试语法如下所示:
grammar DotTest;
span returns [double value]
: ID'['e=INT'..'f=INT']' { /*some code to process the values*/ $value = (double)(Int32.Parse($e.text) + Int32.Parse($f.text)); } ;
num returns [double value]
: DOUBLE {$value = double.Parse($DOUBLE.text); } ;
INT : '0'..'9'+ ;
DOUBLE : '0'..'9'+'.''0'..'9'+ ;
ID : 'a'..'z'+ ;
WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;
Run Code Online (Sandbox Code Playgroud)
问题:规则span无法正确解析其输入,因为它与DOUBLE令牌冲突.词法分析器尝试匹配2..5为a DOUBLE并失败.以下是它在ANTLR Works中的外观: …
如果有人能够从前瞻性关系背后的混淆中清除我的想法,那就是涉及格雷斯/非贪婪匹配的令牌化,我会非常高兴.这是一个稍长的帖子,因为它跟随我的思考过程.
我正在尝试编写antlr3语法,允许我匹配输入,如:
"identifierkeyword"
我在Antlr 3.4中提出了类似的语法:
KEYWORD: 'keyword' ;
IDENTIFIER
:
(options {greedy=false;}: (LOWCHAR|HIGHCHAR))+
;
/** lowercase letters */
fragment LOWCHAR
: 'a'..'z';
/** uppercase letters */
fragment HIGHCHAR
: 'A'..'Z';
parse: IDENTIFIER KEYWORD EOF;
Run Code Online (Sandbox Code Playgroud)
然而,它抱怨它永远不会匹配IDENTIFIER这种方式,我真的不明白.(以下替代方案永远不能匹配:1)
基本上我试图指定试图匹配(LOWCHAR | HIGHCHAR)非贪婪方式的词法分析器,因此它停在KEYWORD前瞻.到目前为止我读到的关于ANTLR词法分析器的内容应该是词法规则的某种优先权.如果我首先在词法分析器语法中指定KEYWORD词法分析器规则,那么之后的任何词法分析器规则都不应该与消耗的字符匹配.
经过一些搜索后我明白这里的问题是它无法以正确的方式对输入进行标记,因为例如输入:"identifierkeyword"首先出现"标识符"部分,因此当没有KEYWORD时它决定开始匹配IDENTIFIER规则令牌匹配了.
然后我尝试在ANTLR 4中编写相同的语法,以测试新的预装功能是否可以匹配我想要的,它看起来像这样:
KEYWORD: 'keyword' ;
/** lowercase letters */
fragment LOWCHAR
: 'a'..'z';
/** uppercase letters */
fragment HIGHCHAR
: 'A'..'Z';
IDENTIFIER
:
(LOWCHAR|HIGHCHAR)+?
;
parse: IDENTIFIER KEYWORD EOF;
Run Code Online (Sandbox Code Playgroud)
对于输入:"identifierkeyword"它会产生此错误:第1行:1不匹配的输入'd'期待'关键字'
它将字符'i'(第一个字符)与IDENTIFIER标记匹配,然后解析器需要一个KEYWORD标记,他不会这样做.
对于词法分析器的非贪婪匹配是不是应该匹配,直到前瞻中有任何其他可能性?难道它不应该期待IDENTIFIER可以包含KEYWORD并以这种方式匹配吗?
我真的对此感到困惑,我看过Terence Parr介绍ANTLR4的新功能的视频,他谈到了在实际匹配规则的同时监视所有"正确"解决方案的预先运行的线程.我认为它也适用于Lexer规则,其中用于标记输入"identifierkeyword"的可能正确解决方案匹配IDENTIFIER:"identifier"并匹配KEYWORD:"keyword"
我觉得我脑子里有很多关于非贪婪/贪婪匹配的错误.有人可以解释一下它是如何工作的吗?
在这之后我在这里发现了一个类似的问题:ANTLR尝试在更长的令牌中匹配令牌,并制作了与之对应的语法:
parse
:
identifier …Run Code Online (Sandbox Code Playgroud)