我正在尝试使用ANTLR解析CSS,或者至少是基础知识.我的lexer规则遇到了一些问题.问题在于ID选择器和十六进制颜色值之间的模糊性.为清晰起见,使用简化的语法,请考虑以下输入:
#bbb {
color: #fff;
}
Run Code Online (Sandbox Code Playgroud)
以及以下解析器规则:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
Run Code Online (Sandbox Code Playgroud)
和这些词法分析器:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为#bbb被标记为COLOR标记,即使它应该是一个选择器.如果我将选择器更改为不以十六进制字符开头,则它可以正常工作.我不知道如何解决这个问题.有没有办法让ANTLR将特定令牌仅作为COLOR令牌处理,如果它在某个位置?比方说,如果它属于属性规则,我可以放心地认为它是一个颜色标记.如果不是,请将其视为选择器.
任何帮助,将不胜感激!
解决方案:原来我试图在语法中做太多,我应该在使用AST的代码中处理.CSS有太多不明确的令牌可靠地分成不同的令牌,所以我现在使用的方法基本上是对'#','.',':'和花括号等特殊字符进行标记,并在消费者代码.工作得更好,处理边缘情况更容易.
我试图解析ANTLR中的数据文件 - 它具有可选的空格
3 6
97 12
15 18
Run Code Online (Sandbox Code Playgroud)
以下显示了行的开始和结束位置.最后有一个换行符,没有标签.
^ 3 6$
^ 97 12$
^ 15 18$
^
Run Code Online (Sandbox Code Playgroud)
我的语法是:
lines : line+;
line : ws1 {System.out.println("WSOPT :"+$ws1.text+":");}
num1 {System.out.println("NUM1 "+$num1.text);}
ws2 {System.out.println("WS :"+$ws2.text+":");}
num2 {System.out.println("NUM2 "+$num2.text);}
NEWLINE
;
num1 : INT ;
num2 : INT ;
ws1 : WSOPT;
ws2 : WS;
INT : '0'..'9'+;
NEWLINE : '\r'? '\n';
//WS : (' '|'\t' )+ ;
WS : (' ')+ ;
WSOPT : (' ')* ;
Run Code Online (Sandbox Code Playgroud)
这使
line 1:0 …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个准确的AS3语法(格式不是问题,但我认为ANTLR最具特色)用于我正在制作的练习语法.
什么是AS3最准确的语法?
这个语法有什么区别:
...
if_statement : 'if' condition 'then' statement 'else' statement 'end_if';
...
Run Code Online (Sandbox Code Playgroud)
还有这个:
...
if_statement : IF condition THEN statement ELSE statement END_IF;
...
IF : 'if';
THEN: 'then';
ELSE: 'else';
END_IF: 'end_if';
....
Run Code Online (Sandbox Code Playgroud)
?
如果有任何差异,因为这会影响性能......谢谢
我有一个简单的语法:
grammar sample;
options { output = AST; }
assignment
: IDENT ':=' expr ';'
;
expr
: factor ('*' factor)*
;
factor
: primary ('+' primary)*
;
primary
: NUM
| '(' expr ')'
;
IDENT : ('a'..'z')+ ;
NUM : ('0'..'9')+ ;
WS : (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;
Run Code Online (Sandbox Code Playgroud)
现在我想添加一些重写规则来生成AST.从我在网上阅读的语言模式书中,我应该能够像这样修改语法:
assignment
: IDENT ':=' expr ';' -> ^(':=' IDENT expr)
;
expr
: factor ('*' factor)* -> ^('*' factor+)
;
factor
: primary ('+' primary)* -> ^('+' primary+)
; …Run Code Online (Sandbox Code Playgroud) 我有这个简单的语法:
expr: factor;
factor: atom (('*' ^ | '/'^) atom)*;
atom: INT
| ':' expr;
INT: ('0'..'9')+
Run Code Online (Sandbox Code Playgroud)
当我跑它时它说:
决策可以使用多个替代1,2匹配输入,例如'*'
决策可以使用多个备选方案1,2匹配输入,例如'/'
我无法发现模棱两可.红色箭头是如何指向的?任何帮助,将不胜感激.

我想在Android上使用ANTLR,我发现了这个: ANTLR和Android
下载AntlrJavaRuntime后,我不知道该怎么做,我应该这样做:
1. lunch the appropriate target
2. make AntlrJavaRuntime
3. verify that AntlrJavaRuntime.xml was placed in /system/etc/permissions and
4. AntlrJavaRuntime.jar was placed in /system/framework
5. after this, you can run a normal make
Run Code Online (Sandbox Code Playgroud)
首先,第1步甚至意味着什么?
其次,当我尝试做:make AntlrJavaRuntime我得到以下错误:
~/AntlrJavaRuntime$ make AntlrJavaRuntime
make: Nothing to be done for `AntlrJavaRuntime'.
Run Code Online (Sandbox Code Playgroud)
很难找到有关这方面的文档,因此非常感谢任何帮助(或者是如何让ANTLR为Android项目做好准备的明确示例).
我似乎正在努力解决AST-> StringTemplate方面的问题,可能是因为我来自手工编写解析器 - > LLVM.
我正在寻找的是一种自动将解析规则与可以表示它的AST类匹配的方法,并且包含生成目标语言输出的方法.(在这种情况下可能使用StringTemplate.)
在伪代码中,给出了这个示例语法:
numberExpression
: DIGIT+
;
Run Code Online (Sandbox Code Playgroud)
我想让它映射到这个AST类:
class NumberExpressionAST extends BaseAST {
private double value;
public NumberExpressionAST(node) {
this.value = node.value;
}
public String generateCode() {
// However we want to generate the output.
// Maybe use a template, maybe string literals, maybe cure cancer...whatever.
}
}
Run Code Online (Sandbox Code Playgroud)
为了交配它们,也许会有一些胶水如下:(或者你可能会疯狂的Class.forName东西)
switch (child.ruleName) {
case 'numberExpression':
return new NumberExpressionAST(child);
break;
}
Run Code Online (Sandbox Code Playgroud)
我一直在网上搜索,我在语法中找到了解析重写规则,->但我似乎无法弄清楚如何将所有这些逻辑排除在语法之外.特别是从模板设置和生成目标输出的代码.我可以多次走树了.
我想也许我可以使用该选项output=AST,然后可能提供我自己的从CommonTree扩展的AST类?我承认,我对ANTLR的把握非常原始,所以请原谅我的无知.我所遵循的每个教程都显示了所有这些内容与语法内联,这对我来说是完全疯狂和难以维护的.
有人能指出我一种完成类似事情的方法吗?
目标:保持AST/codegen /模板逻辑不受语法限制.
编辑---------------------------------------------
我使出通过ANTLR的实际源代码跟踪(因为他们使用自己),我看到这样类似的事情BlockAST, …
我正在使用main/resources/antlr-4.2-complete.jar外部库。我已经将它包含在我的类路径中。但是当我运行测试目标时,在 Eclipse 中我收到以下消息
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.048 sec <<< FAILURE!
checkGrammar(br.com.stoneage.GrammarTest) Time elapsed: 0.011 sec <<< ERROR!
java.lang.NoClassDefFoundError: org/antlr/v4/runtime/CharStream
Run Code Online (Sandbox Code Playgroud)
所以我知道测试目标不是寻找antlr-4.2-complete.jar。我该如何解决这个问题?
这是我的 POM 文件:
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.048 sec <<< FAILURE!
checkGrammar(br.com.stoneage.GrammarTest) Time elapsed: 0.011 sec <<< ERROR!
java.lang.NoClassDefFoundError: org/antlr/v4/runtime/CharStream
Run Code Online (Sandbox Code Playgroud) 在我当前的项目中,我编写了高级规范(如下所示以供参考),并使用在ANTLR中编写的语法解析它,然后使用StringTempate生成等效的Java编程代码.现在,我的客户发现编写这个文本高级规范很困难,并希望我提供等效的可视化拖放编程构造和编辑器来指定这种编程结构.我的问题是:eclipse是否提供任何拖放工作台来开发可视化编程构造和编辑器? 它可能很容易与ANTLR集成.
示例示例或其链接将非常有用.
TemperatureSensor
generate tempMeasurement : TempStruct;
TempStruct
tempValue : double;
unitOfMeasurement: String;
Run Code Online (Sandbox Code Playgroud)