使用antlr 4解析文件时,标记可以识别整个字符串的标题

使用antlr 4解析文件时,标记可以识别整个字符串的标题,antlr,antlr4,vcf-vcard,Antlr,Antlr4,Vcf Vcard,当我试图解析vCard之类的东西时,当我设置一个令牌从输入中将名字读为“FN”时,我无法使用getText();方法。因为getText()之前的表达式;必须从一开始就与表达式相同 | Firstname {System.out.println("First Name : " +$Letters.getText());} | Letters Firstname: 'FN'; Letters: [A-Za-z0-9-]+; vCard code: BEGI

当我试图解析vCard之类的东西时,当我设置一个令牌从输入中将名字读为“FN”时,我无法使用getText();方法。因为getText()之前的表达式;必须从一开始就与表达式相同

| Firstname         {System.out.println("First Name : " +$Letters.getText());}
| Letters           

Firstname: 'FN';
Letters: [A-Za-z0-9-]+;

vCard code:
BEGIN:VCARD
VERSION:4.0
PRODID:-//BBros.us llc//bvCard.com//EN
N:Nick;Jonas;;;
FN:Nick Jonas
由于我在Firstname的表达式中使用“$Letters.getText()”,因此该代码将无法工作。所以我想知道在antlr中是否有一种方法,我可以阅读前几个字母,然后打印出其余的信息。我不知道getText()是否;这是唯一的办法。因为在vCard代码中,我不知道如何从“FN:Nick Jonas”中读取“FN”,然后打印“Nick Jonas”


谢谢

我不完全了解您到底想解析什么以及如何解析,但对于实际问题,您可以这样做:

Firstname Letters {System.out.println("First name: " + $Letters.getText());}
这是因为我假设xou希望
字母
名字
之后进行匹配,因为(对我来说)如果不这样做,尝试从
名字
替代项中引用相应的标记就没有意义了。

但是,如果您真的只想匹配一个前缀,然后打印出之后的所有内容,您可以这样做(如果您想使用Antlr而不是Regex):

这将匹配
Firstname
,然后匹配到文件末尾的每个lexer标记。
为了使这项工作适用于每个尾随输入,您可以在语法底部定义一个通配符lexer规则,该规则与之前未被lexer规则匹配的每个输入相匹配:

ANY: .+ ;

所有尾随令牌将以数组(或列表…不确定此atm)的形式存储在
content
whcih中,然后您可以参考该数组来重新组合尾随输入。

我不完全了解您想要准确解析什么以及如何解析,但对于实际问题,您可以这样做:

Firstname Letters {System.out.println("First name: " + $Letters.getText());}
这是因为我假设xou希望
字母
名字
之后进行匹配,因为(对我来说)如果不这样做,尝试从
名字
替代项中引用相应的标记就没有意义了。

但是,如果您真的只想匹配一个前缀,然后打印出之后的所有内容,您可以这样做(如果您想使用Antlr而不是Regex):

这将匹配
Firstname
,然后匹配到文件末尾的每个lexer标记。
为了使这项工作适用于每个尾随输入,您可以在语法底部定义一个通配符lexer规则,该规则与之前未被lexer规则匹配的每个输入相匹配:

ANY: .+ ;

所有尾随令牌将存储为一个数组(或列表…不确定此atm)在
content
whcih中,您可以参考以重新组合尾随输入。

是否有一种方法可以打印出行尾或行尾,而不是文件的结尾?只需用另一个标记(例如
\n
)替换
EOF
)如果需要,可以添加可选的右递归有没有一种方法可以打印出行的结尾或行的结尾而不是文件的结尾?只需将
EOF
替换为另一个标记(例如
\n
),如果需要,可以添加可选的右递归