Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 忽略标记字符中的标记?_Parsing_Antlr_Antlr3 - Fatal编程技术网

Parsing 忽略标记字符中的标记?

Parsing 忽略标记字符中的标记?,parsing,antlr,antlr3,Parsing,Antlr,Antlr3,我在lexer中定义了一个字符字符串(例如“abcd”): 是否可以忽略这两个撇号,然后在lexer中不使用它们就可以获得令牌字符串(通过$CharacterString.text->chars) 我试过 CharacterString: Apostrophe { $channel = HIDDEN; } (Alphanumeric)* Apostrophe { $channel = HIDDEN; } ; 。。。没有成功。。。这种情况甚至不再匹配我的字符串(例如,“oiu”将在p

我在lexer中定义了一个字符字符串(例如“abcd”):

是否可以忽略这两个撇号,然后在lexer中不使用它们就可以获得令牌字符串(通过$CharacterString.text->chars)

我试过

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)在这方面缺乏。当然不客气。