我有以下Antlr语法:
grammar MyGrammar;
doc : intro planet;
intro : 'hi';
planet : 'world';
MLCOMMENT
: '/*' ( options {greedy=false;} : . )* '*/' { $channel = HIDDEN; };
WHITESPACE : (
(' ' | '\t' | '\f')+
|
// handle newlines
( '\r\n' // DOS/Windows
| '\r' // Macintosh
| '\n' // Unix
)
)
{ $channel = HIDDEN; };
Run Code Online (Sandbox Code Playgroud)
在ANTLRWorks 1.2.3解释器,输入hi world,hi/**/world和hi /*A*/ world工作,符合市场预期.
但是,hiworld也应该接受不应该起作用的输入.我怎么做hiworld失败?如何在"hi"和"world"之间强制至少有一个空格(或注释)? …
鉴于语法
test : 'test' ID '\n' 'begin' '\n' 'end' '\n' -> ^(TEST ID);
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
Run Code Online (Sandbox Code Playgroud)
和测试字符串
"test blah\n begin\n end\n"
Run Code Online (Sandbox Code Playgroud)
导致
line 1:0 mismatched input 'test blah\\n begin\\n end\\n' expecting 'test'
<mismatched token: [@0,0:21='test blah\\n begin\\n end\\n',<12>,1:0], resync=test blah
begin
end
>
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
我使用ANTLRWorks来获得简单的语法:
grammar boolean;
// [...]
lowercase_string
: ('a'..'z')+ ;
Run Code Online (Sandbox Code Playgroud)
但是,根据口译员的lowercase_string不符foobar(MismatchedSetException(10!={}).想法?
我正在编写一个小的csharp控制台应用程序,它从控制台读取文本,做一些操作并返回一个字符串.为此,我使用的是Antlr.语法文件如下所示.
grammar test;
options {
language = CSharp2;
output = AST;
}
start returns [String res]: expression EOF
{
$res=$expression.res;
} ;
expression returns [String res]
: Identifier {$res=$Identifier.text}
|Num {$res=$num.text;
|function {$res=function.res}
;
function: 'left' '( Identifier ')'{some code here}
| 'right' '( Identifier ')'{some code here}
|..........
;
Num : (Minus)?('0'..'9')+ ;
Identifier : ('a'..'z'|'A'..'Z'|'\\'|'/'|'_'|':'|';'|'?'|'.'|'0'..'9')('a'..'z'|'A'..'Z'|'\\'|'/'|'_'|':'|';'|'.'|'?'|'0'..'9')*;
Run Code Online (Sandbox Code Playgroud)
我有几个这样的函数,它们进行一些字符串操作.现在,我希望Antlr无论如何都能识别这些函数名称.目前,它只接受小写字母作为函数名称,例如.. upper(asdf).我无法在我的应用程序中将每个标记转换为小写,因为它也会更改标识符的大小写.我怎样才能做到这一点?
我知道ANTLR可以接受LL(*)语法.但是,有没有办法检查语法是否是LL(1)或不使用ANTLR?
我正在使用带有c#目标的Antlr 4.这是我的语法的一个子集:
/*
* Parser Rules
*/
text : term+ EOF;
term : a1 a2 a3;
a1: ....
...
...
Run Code Online (Sandbox Code Playgroud)
我想接受有效数据块作为(term)s,当出现错误时我想搜索下一个有效术语并打印出导致错误的整个文本,供用户手动分析.
如何将输入同步到下一个有效期限?以及如何获取被忽略的文本?
我是ANTLR的新手.我开始探索ANTLR教程.我已经看到了为特定规则定义了返回类型的示例(参见下面的示例).
我也可以将争论传递给统治吗?我只是想到了,我想根据提供给它的论点改变一个微观状态的规则行为.
如果它在ANTLR中可以通过,请帮帮我,还是这样做是个好主意?
atom returns [int value]
:
INT
{
$value = Integer.parseInt($INT.text);
}
| ID // variable reference
{
Integer v = (Integer) memory.get($ID.text);
if (v != null)
$value = v.intValue();
}
;
Run Code Online (Sandbox Code Playgroud) 对于下面的语法,
grammar names;
fullname : TITLE? FIRST_NAME LAST_NAME;
TITLE : 'Mr.' | 'Ms.' | 'Mrs.' ;
FIRST_NAME : ('A'..'Z' | 'a'..'z')+ ;
LAST_NAME : ('A'..'Z' | 'a'..'z')+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
在解析像"John Smith先生"这样的输入时,它会抛出异常
mismatched input 'Smith' expecting LAST_NAME
Run Code Online (Sandbox Code Playgroud)
是否可以配置ANTLR来处理这种情况?如果不可能,可以采用哪种替代方法来处理它?
请注意,它不仅限于这种简单的情况.
我是ANTLR的新手。我刚刚发现,可以像这样在生产中标记每个替代品:
foo
: a # aLabel
| b # bLabel
| // ...
;
Run Code Online (Sandbox Code Playgroud)
但是,我发现必须标记所有替代方案或不标记替代方案是令人不快的。最近,我只需要标记具有20个以上分支的产品中的2个替代品,最后我标记了每个其他替代品# stubLabel。有什么理由要全部或不加标签?
我正在使用ANTLR4和Java定义语法。对于Integers,我想要一个以减号开头的数字。我知道可以这样做:
integer: '-' (DIGIT)* | DIGIT* ;
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有一个符号(类似于*)来确保减号出现零或一次:
integer: ('-')<some symbol here> (DIGIT)* ;
Run Code Online (Sandbox Code Playgroud)