簡體   English   中英

忽略令牌字符中的令牌?

[英]Ignore tokens in the token characters?

我的詞法分析器中有以下標記定義,用於定義一個CharacterString(例如'abcd'):

CharacterString:
  Apostrophe
  (Alphanumeric)*
  Apostrophe
;

是否有可能忽略兩個撇號,從而能夠在詞法分析器中沒有它們的情況下獲得令牌字符串(通過$ CharacterString.text-> chars)?

我試過了 ...

CharacterString:
  Apostrophe { $channel = HIDDEN; }
  (Alphanumeric)*
  Apostrophe { $channel = HIDDEN; }
;

...沒有成功...這種情況甚至不匹配我的字符串(例如'oiu'在解析器中將失敗-匹配設置不匹配異常)。

謝謝 :)

內聯代碼{$channel=HIDDEN;}影響整個CharacterString ,因此您不能像嘗試的那樣進行操作。

您將需要添加一些自定義代碼並自行刪除引號。 這是一個小的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
  :  .
  ;

和一點測試功能:

#include "TLexer.h"
#include "TParser.h"

int main(int argc, char *argv[])
{
  pANTLR3_UINT8 fName = (pANTLR3_UINT8)"input.txt";
  pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew(fName);

  if(input == NULL)
  {
    fprintf(stderr, "Failed to open file %s\n", (char *)fName);
    exit(1);
  }

  pTLexer lexer = TLexerNew(input);

  if(lexer == NULL)
  {
    fprintf(stderr, "Unable to create the lexer due to malloc() failure1\n");
    exit(1);
  }

  pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));

  if(tstream == NULL)
  {
    fprintf(stderr, "Out of memory trying to allocate token stream\n");
    exit(1);
  }

  pTParser parser = TParserNew(tstream);

  if(parser == NULL)
  {
    fprintf(stderr, "Out of memory trying to allocate parser\n");
    exit(ANTLR3_ERR_NOMEM);
  }

  parser->parse(parser);

  parser->free(parser);   parser = NULL;
  tstream->free(tstream); tstream = NULL;
  lexer->free(lexer);     lexer = NULL;
  input->close(input);    input = NULL;

  return 0;
}

測試的input.txt文件包含:

'abc'

如果現在是1)生成詞法分析器和解析器,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 (不帶引號)被打印到控制台。

您可以通過詞法分析器的RecognizerSharedState state屬性來影響令牌的構造:

CharacterString:
  Apostrophe
  CharSequence
  Apostrophe
  { state.text = $CharSequence.text; }
;

fragment CharSequence:
  Alphanumeric+
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM