Parsing 使用setText更改antlr4中规则的文本

Parsing 使用setText更改antlr4中规则的文本,parsing,grammar,antlr4,Parsing,Grammar,Antlr4,我想将csv文件中的每个条目都更改为“BlahBlah” 为此,我将antlr语法作为 grammar CSV; file : hdr row* row1; hdr : row; row : field (',' value1=field)* '\r'? '\n'; // '\r' is optional at the end of a row of CSV file .. row1 : field (',' field)* '\r'? '\n'?; field :

我想将csv文件中的每个条目都更改为“BlahBlah” 为此,我将antlr语法作为

grammar CSV;

file : hdr row* row1;
hdr : row;

row :  field (',' value1=field)* '\r'? '\n'; // '\r' is optional at the end of a row of CSV file ..

row1 :  field (',' field)* '\r'? '\n'?;

field 
      :  TEXT
    {
        $setText("BlahBlah");
    }
      |  STRING 
      | 
      ;
TEXT : ~[,\n\r"]+ ;
STRING : '"' ('""' | ~'"')* '"' ;
但是当我在antlr4上运行这个时

error(63): CSV.g4:13:3: unknown attribute reference setText in $setText
make: *** [run] Error 1

为什么antlr4不支持setText,还有其他替代文本的方法吗?

tl;博士

给出以下语法(源自原始CSV.g4示例和OP的语法尝试(参见问题)):

编译它可以完美地工作:

$> javac CSVBlindText*.java
Testdata(刚刚重命名的users.csv文件):

试验中的产量:

$> grun CSVBlindText file blinded_by_grammar.csv 
header: 'BlahBlah,BlahBlah,BlahBlah'
values = {BlahBlah=BlahBlah}
values = {BlahBlah=BlahBlah}
values = {BlahBlah=BlahBlah}
3 rows
row token interval: 6..11
row token interval: 12..17
row token interval: 18..23
因此,
setText()
似乎应该在产品的分号之前注入,而不是在备选方案之间注入(这里是胡乱猜测;-)

之前的迭代如下:

只是猜测一下,因为我1)目前没有可用的antlr4,2)已经有相当一段时间没有编写antlr4语法了-可能没有美元($)

更新:现在有了antlr 4.5.2(至少通过
brew
)而不是4.5.3,我深入探讨了这一点,并回答了下面来自OP的一些评论:如果语法定义良好,将在lexer java模块中生成
setText()
。不幸的是,为像我这样的外行调试antlr4语法是。。。但是,尽管如此,还是有非常好的语言构造工具包

示例会话:

$> antlr4 -no-listener CSV.g4 
$> grep setText CSVLexer.java 
            setText( String.valueOf(getText().charAt(1)) );
使用的语法: (从通过以下途径检索的示例代码中黑客入侵:

curl-Ohttp://media.pragprog.com/titles/tpantlr2/code/tpantlr2-code.tgz

现在使用匹配的csv文件进行测试:

a,b
"y",'4'
作为:

因此,最后,我建议修改语法的逻辑(我认为插入“BlahBlahBlah”并不是必要的,只是一种调试技巧)

并引用:

ANTLR讨论

Please do not start discussions at stackoverflow. They have asked us to 
steer discussions (i.e., non-questions/answers) away from Stackoverflow; we 
have a discussion forum at Google specifically for that:

https://groups.google.com/forum/#!forum/antlr-discussion

We can discuss ANTLR project features, direction, and generally argue about 
whatever we want at the google discussion forum.

我希望这有帮助。

tl;博士

给出以下语法(源自原始CSV.g4示例和OP的语法尝试(参见问题)):

编译它可以完美地工作:

$> javac CSVBlindText*.java
Testdata(刚刚重命名的users.csv文件):

试验中的产量:

$> grun CSVBlindText file blinded_by_grammar.csv 
header: 'BlahBlah,BlahBlah,BlahBlah'
values = {BlahBlah=BlahBlah}
values = {BlahBlah=BlahBlah}
values = {BlahBlah=BlahBlah}
3 rows
row token interval: 6..11
row token interval: 12..17
row token interval: 18..23
因此,
setText()
似乎应该在产品的分号之前注入,而不是在备选方案之间注入(这里是胡乱猜测;-)

之前的迭代如下:

只是猜测一下,因为我1)目前没有可用的antlr4,2)已经有相当一段时间没有编写antlr4语法了-可能没有美元($)

更新:现在有了antlr 4.5.2(至少通过
brew
)而不是4.5.3,我深入探讨了这一点,并回答了下面来自OP的一些评论:如果语法定义良好,将在lexer java模块中生成
setText()
。不幸的是,为像我这样的外行调试antlr4语法是。。。但是,尽管如此,还是有非常好的语言构造工具包

示例会话:

$> antlr4 -no-listener CSV.g4 
$> grep setText CSVLexer.java 
            setText( String.valueOf(getText().charAt(1)) );
使用的语法: (从通过以下途径检索的示例代码中黑客入侵:

curl-Ohttp://media.pragprog.com/titles/tpantlr2/code/tpantlr2-code.tgz

现在使用匹配的csv文件进行测试:

a,b
"y",'4'
作为:

因此,最后,我建议修改语法的逻辑(我认为插入“BlahBlahBlah”并不是必要的,只是一种调试技巧)

并引用:

ANTLR讨论

Please do not start discussions at stackoverflow. They have asked us to 
steer discussions (i.e., non-questions/answers) away from Stackoverflow; we 
have a discussion forum at Google specifically for that:

https://groups.google.com/forum/#!forum/antlr-discussion

We can discuss ANTLR project features, direction, and generally argue about 
whatever we want at the google discussion forum.

我希望这能有所帮助。

这里有两个问题:

首先,必须识别
setText
方法的接收者。可能想要

field  :  TEXT    { $TEXT.setText("BlahBlah"); }
       |  STRING 
       ;
其次是
setText
未在
Token
类中定义


通常,创建自己的令牌类扩展
CommonToken
和相应的令牌工厂类。将
TokenLableType
(在选项块中)设置为您的令牌类名。
CommonToken
中的
setText
方法将可见。

这里有几个问题:

首先,必须识别
setText
方法的接收者。可能想要

field  :  TEXT    { $TEXT.setText("BlahBlah"); }
       |  STRING 
       ;
其次是
setText
未在
Token
类中定义


通常,创建自己的令牌类扩展
CommonToken
和相应的令牌工厂类。将
TokenLableType
(在选项块中)设置为您的令牌类名。
CommonToken
中的
setText
方法将可见。

no。。这不起作用,是可以接受的,因为Java没有“宏”功能,而Antlr提供了一系列符号,如$来识别这种类型的方法。我认为这最适合作为注释而不是答案。。但是感谢你让我思考在我的PDF电子书第189页的权威antlr 4参考第10.3节“识别关键字不固定的语言”中放入$Hm的原因。actions/Keywords.g4语法使用这个setText()作为:CHAR:'\''.''''''''''''''''{setText(String.ValueOf(getText().charAt(1));};将单引号字符转换为未经修饰的单字符字符串。当环境再次可用时,我将尝试这样做:antlr4-无侦听器关键字.g4&&javac关键字*.java-这不是LEXER vs.PARSER部分的事情吗?:非常感谢您提供的指针。。但问题仍然没有解决,“setText未被识别”的错误仍然存在。我还没有导入任何java库。你知道必须导入哪些库吗(如果某些库必须为setText导入)@Percy123:请重新检查我的答案。它不在库中,而是在antlr的语法到令牌/java转换中,需要生成setText。HTHno。。这不起作用,是可以接受的,因为Java没有“宏”功能,而Antlr提供了一系列符号,如$来识别这种类型的方法。我认为这最适合作为注释而不是答案。。但是感谢你让我思考在权威的antlr 4参考文献第10.3节“识别关键字不固定的语言”中放入$Hm的原因
field  :  TEXT    { $TEXT.setText("BlahBlah"); }
       |  STRING 
       ;