首页>Program>source

我对antlr不太熟悉.我使用的是第4版,并且我有一种语法,其中空格在某些部分中并不重要(但在其他地方可能不是,或者很幸运)。

所以说我们有以下语法

grammar Foo;
program : A* ;
A  : ID '@' ID '(' IDList ')' ';' ;
ID : [a-zA-Z]+ ;
IDList : ID (',' IDList)* ;
WS : [ \t\r\n]+ -> skip ;

和测试输入

[email protected](X,Y);
[email protected]  ( z,Z) ;

第一行被正确解析,而第二行则未被正确解析。 我不想用空格不相关的地方来污染我的规则,因为我的实际语法比玩具示例更复杂.如果不清楚,部件ID'@'ID不应有空格.空格在任何其他位置都没有关系。

最新回答
  • 1月前
    1 #

    定义 ID '@' ID   作为词法分析器令牌而不是解析器令牌。

    A  : AID '(' IDList ')' ';' ;
    AID : [a-zA-Z]+ '@' [a-zA-Z]+;
    

    其他选项

    威兹威兹 p

    即使您跳过wS,词法分析器规则仍然对空白字符的存在很敏感.跳过只是意味着不会生成任何令牌供解析器使用.因此,lexer

      enable/disable whitespaces in your token stream, e.g. here

      enable/disable whitespaces with lexer modes (may be a problem because lexer modes are triggered on context, which is not easy to determine in your case)

      规则明确不允许任何内部空格字符.

    相反, Addr   和 a   解析器规则永远不会看到内部的空白标记,因此这些规则对生成的标记之间出现的空白字符不敏感。

    idList
    
    grammar Foo; program : a* EOF ; // EOF will require parsing the entire input a : Addr LParen IDList RParen Semi ; idList : ID (Comma ID)* ; // simpler equivalent construct Addr : ID '@' ID ID : [a-zA-Z]+ ; WS : [ \t\r\n]+ -> skip ;

  • javascript:更改立方体一面的颜色-THREEjs
  • .net:解决x64 com互操作封送处理问题