标签: antlr

Antlr隐藏的通道空白问题

我有以下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/**/worldhi /*A*/ world工作,符合市场预期.

但是,hiworld应该接受不应该起作用的输入.我怎么做hiworld失败?如何在"hi"和"world"之间强制至少有一个空格(或注释)? …

whitespace hidden antlr ignore channel

2
推荐指数
1
解决办法
3396
查看次数

如何解决ANTLR不匹配输入的问题

鉴于语法

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)

这里出了什么问题?

antlr antlr3

2
推荐指数
1
解决办法
2185
查看次数

将小写与ANTLR匹配

我使用ANTLRWorks来获得简单的语法:

grammar boolean;

// [...]
lowercase_string
        :   ('a'..'z')+ ;
Run Code Online (Sandbox Code Playgroud)

但是,根据口译员的lowercase_string不符foobar(MismatchedSetException(10!={}).想法?

antlr antlrworks

2
推荐指数
1
解决办法
163
查看次数

使一些解析器规则在antlr中不区分大小写

我正在编写一个小的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 antlr3

2
推荐指数
1
解决办法
2503
查看次数

使用ANTLR验证LL(1)语法

我知道ANTLR可以接受LL(*)语法.但是,有没有办法检查语法是否是LL(1)或不使用ANTLR?

grammar antlr

2
推荐指数
1
解决办法
904
查看次数

如何在Antlr 4/c中控制错误处理和同步#

我正在使用带有c#目标的Antlr 4.这是我的语法的一个子集:

/*
 * Parser Rules
 */
text : term+  EOF;
term : a1 a2 a3;
a1: ....
...
...
Run Code Online (Sandbox Code Playgroud)

我想接受有效数据块作为(term)s,当出现错误时我想搜索下一个有效术语并打印出导致错误的整个文本,供用户手动分析.

如何将输入同步到下一个有效期限?以及如何获取被忽略的文本?

grammar antlr antlr4

2
推荐指数
1
解决办法
4049
查看次数

ANTLR:带参数的规则?

我是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)

java antlr antlr3

2
推荐指数
1
解决办法
2924
查看次数

是否可以配置ANTLR语法以使用具有相同结构的两个令牌?

对于下面的语法,

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来处理这种情况?如果不可能,可以采用哪种替代方法来处理它?

请注意,它不仅限于这种简单的情况.

java parsing antlr antlr4

2
推荐指数
1
解决办法
218
查看次数

为什么ANTLR要求标记所有替代品或不标记替代品?

我是ANTLR的新手。我刚刚发现,可以像这样在生产中标记每个替代品:

foo
    : a # aLabel
    | b # bLabel
    | // ...
    ;
Run Code Online (Sandbox Code Playgroud)

但是,我发现必须标记所有替代方案或不标记替代方案是令人不快的。最近,我只需要标记具有20个以上分支的产品中的2个替代品,最后我标记了每个其他替代品# stubLabel。有什么理由要全部或不加标签?

grammar antlr antlr4

2
推荐指数
2
解决办法
599
查看次数

ANTLR4:零或一倍

我正在使用ANTLR4和Java定义语法。对于Integers,我想要一个以减号开头的数字。我知道可以这样做:

integer: '-' (DIGIT)* | DIGIT* ;
Run Code Online (Sandbox Code Playgroud)

但是我想知道是否有一个符号(类似于*)来确保减号出现零或一次:

integer: ('-')<some symbol here> (DIGIT)* ;
Run Code Online (Sandbox Code Playgroud)

grammar antlr antlr3 antlr4

2
推荐指数
1
解决办法
1552
查看次数

标签 统计

antlr ×10

antlr3 ×4

antlr4 ×4

grammar ×4

java ×2

antlrworks ×1

channel ×1

hidden ×1

ignore ×1

parsing ×1

whitespace ×1