簡體   English   中英

標識符標記關鍵字antlr解析器

[英]identifier token keyword antlr parser

如何處理令牌'for'用於解析語言中的兩種不同情況的情況? 如聲明和作為“參數”如下例:

echo for print example
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

輸出:

for print example
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

謝謝。

我知道如何做到這一點的唯一方法是在詞法分析器語法中定義一個Echo規則,該規則匹配字符echo后跟除\\r\\n之外的所有其他字符:

Echo
  :  'echo' ~('\r' | '\n')+
  ;

並確保該規則匹配標識符和關鍵字的規則之前 (例如for )。

一個可能的開始的快速演示將是:

grammar Test;

parse
  :  (echo | for)*
  ;

echo
  :  Echo (NewLine | EOF)
  ;

for 
  :  For Identifier In range NewLine
     Do NewLine
     echo
     Done (NewLine | EOF)
  ;

range
  :  '{' Integer '..' Integer ('..' Integer)? '}'
  ;

Echo
  :  'echo' ~('\r' | '\n')+
  ;

For  : 'for';
In   : 'in';
Do   : 'do';
Done : 'done';

Identifier
  :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
  ;

Integer
  :  '0'..'9'+
  ;

NewLine
  :  '\r' '\n'
  |  '\n'
  |  '\r'
  ;

Space
  :  (' ' | '\t') {skip();}
  ;

如果您要解析輸入:

echo for print example
for i in {0..10..2}
do
  echo "Welcome $i times"
done
echo the end for now!

有了它,它看起來像:

alt text http://img571.imageshack.us/img571/5713/grammar.png

(我不得不稍微旋轉圖像,否則它根本不可見!)

HTH。

嗯,這很簡單,大多數語法使用這樣的東西:

TOKEN_REF
    :   'A'..'Z' ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
    ;

因此,當提到print語句時,您會執行以下操作:

'print' (TOKEN_REF)*

並且使用for語句,你只需說明'for',例如:

'for' INT 'in' SOMETHING

為了做到這一點,你需要使用語義謂詞,只有當它真正是for關鍵字時才采用該詞法分析器規則。

有關詳細信息,請參閱ANTLR wiki上的標識符關鍵字

暫無
暫無

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

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