Parsing 忽略标记字符中的标记?
我在lexer中定义了一个字符字符串(例如“abcd”): 是否可以忽略这两个撇号,然后在lexer中不使用它们就可以获得令牌字符串(通过$CharacterString.text->chars) 我试过Parsing 忽略标记字符中的标记?,parsing,antlr,antlr3,Parsing,Antlr,Antlr3,我在lexer中定义了一个字符字符串(例如“abcd”): 是否可以忽略这两个撇号,然后在lexer中不使用它们就可以获得令牌字符串(通过$CharacterString.text->chars) 我试过 CharacterString: Apostrophe { $channel = HIDDEN; } (Alphanumeric)* Apostrophe { $channel = HIDDEN; } ; 。。。没有成功。。。这种情况甚至不再匹配我的字符串(例如,“oiu”将在p
CharacterString:
Apostrophe { $channel = HIDDEN; }
(Alphanumeric)*
Apostrophe { $channel = HIDDEN; }
;
。。。没有成功。。。这种情况甚至不再匹配我的字符串(例如,“oiu”将在parser-Missmatched Set异常中失败)
谢谢:)您可以通过lexer的
RecognizerSharedState
属性影响令牌构造:
字符字符串:
撇号
字符序列
撇号
{state.text=$CharSequence.text;}
;
片段字符序列:
字母数字+
;
您可以通过lexer的RecognizerSharedState
属性影响令牌构造:
字符字符串:
撇号
字符序列
撇号
{state.text=$CharSequence.text;}
;
片段字符序列:
字母数字+
;
内联代码{$channel=HIDDEN;}
会影响整个字符字符串,因此您无法像尝试的那样执行此操作
您需要添加一些自定义代码并删除引号。下面是一个小型的C演示:
grammar T;
options {
language=C;
}
parse
: (t=. {printf(">\%s<\n", $t.text->chars);})+ EOF
;
CharacterString
: '\'' ~'\''* '\''
{
pANTLR3_STRING quoted = GETTEXT();
SETTEXT(quoted->subString(quoted, 1, quoted->len-1));
}
;
Any
: .
;
测试input.txt
文件包含:
'abc'
如果您现在1)生成lexer和parser,2)编译所有.c
源文件,3)运行main
:
# 1
java -cp antlr-3.3.jar org.antlr.Tool T.g
# 2
gcc -Wall main.c TLexer.c TParser.c -l antlr3c -o main
# 3
./main
您将看到abc
(不带引号)正在打印到控制台。内联代码{$channel=HIDDEN;}
会影响整个字符串
,因此无法像您尝试的那样执行
您需要添加一些自定义代码并删除引号。下面是一个小型的C演示:
grammar T;
options {
language=C;
}
parse
: (t=. {printf(">\%s<\n", $t.text->chars);})+ EOF
;
CharacterString
: '\'' ~'\''* '\''
{
pANTLR3_STRING quoted = GETTEXT();
SETTEXT(quoted->subString(quoted, 1, quoted->len-1));
}
;
Any
: .
;
测试input.txt
文件包含:
'abc'
如果您现在1)生成lexer和parser,2)编译所有.c
源文件,3)运行main
:
# 1
java -cp antlr-3.3.jar org.antlr.Tool T.g
# 2
gcc -Wall main.c TLexer.c TParser.c -l antlr3c -o main
# 3
./main
您将看到abc
(不带引号)正在打印到控制台。它不工作。state变量不存在,lexer或解析器中也没有任何类型为RecognizerSharedState的变量。您没有提到您正在使用C-target,我也没有得到它,因此上面的答案是针对antlr java的。然而,我查找了antlr C api和antlr的源代码,找到了访问pANTLR3_BASE_识别器rec
的语法,它是pANTLR3_识别器_SHARED_STATE STATE
:lexer->rec->STATE->text
。我没有时间测试它,但看看它是否有用。这可能是以前的宏所做的。谢谢你的时间!它不起作用。state变量不存在,lexer或解析器中也没有任何类型为RecognizerSharedState的变量。您没有提到您正在使用C-target,我也没有得到它,因此上面的答案是针对antlr java的。然而,我查找了antlr C api和antlr的源代码,找到了访问pANTLR3_BASE_识别器rec
的语法,它是pANTLR3_识别器_SHARED_STATE STATE
:lexer->rec->STATE->text
。我没有时间测试它,但看看它是否有用。这可能是以前的宏所做的。谢谢你的时间!很高兴知道在lexer中可以这样做。现在,我不需要处理字符转义,而且前面给出的解决方案对我不起作用。@Julio,请参阅我的修订答案,包括一个C演示。谢谢。你是怎么找到这些宏的?antlr的文档真的很糟糕…@Julio,我刚才在antlr的邮件列表上看到了它。Java目标有很好的文档记录,是的,一些目标(如C)在这方面缺乏。当然,不客气。很高兴知道在lexer中可以这样做。现在,我不需要处理字符转义,而且前面给出的解决方案对我不起作用。@Julio,请参阅我的修订答案,包括一个C演示。谢谢。你是怎么找到这些宏的?antlr的文档真的很糟糕…@Julio,我刚才在antlr的邮件列表上看到了它。Java目标有很好的文档记录,是的,一些目标(如C)在这方面缺乏。当然不客气。