[英]grammar-free section in javaCC
這是一個簡短的javaCC代碼:
PARSER_BEGIN(TestParser)
public class TestParser
{
}
PARSER_END(TestParser)
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
}
TOKEN : /* LITERALS */
{
<VOID: "void">
| <LPAR: "("> | <RPAR: ")">
| <LBRAC: "{"> | <RBRAC: "}">
| <COMMA: ",">
| <DATATYPE: "int">
| <#LETTER: ["_","a"-"z","A"-"Z"] >
| <#DIGIT: ["0"-"9"] >
| <DOUBLE_QUOTE_LITERAL: "\"" (~["\""])*"\"" >
| <IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
| <VARIABLE: "$"<IDENTIFIER> >
}
public void input():{} { (statement())+ <EOF> }
private void statement():{}
{
<VOID> <IDENTIFIER> <LPAR> (<DATATYPE> <IDENTIFIER> (<COMMA> <DATATYPE> <IDENTIFIER>)*)? <RPAR>
<LBRAC>
<RBRAC>
}
我希望此解析器使用“無語法”部分來處理以下類型的輸入(字符'}'將是該部分的結尾):
void fun(int i, int j)
{
Hello world the value of i is ${i}
and j=${j}.
}
無語法部分將返回
java.util.List<String_or_VariableReference>
我應該如何修改javacc解析器以處理此部分?
謝謝。
如果我對問題的理解正確,那么您希望暫時允許任意輸入,然后切換回您的語言。 如果您可以決定何時僅基於標記進行切換,那么使用兩個詞法狀態就很容易做到。 對您的編程語言使用默認狀態。 當在默認狀態下看到“ {”時,請切換到其他狀態
TOKEN: { <LBRACE : "{" > : FREE }
在自由狀態下,看到“}”時,切換回默認狀態; 當看到其他任何字符時,將其傳遞給解析器。
<FREE> TOKEN { <RBRACE : "}" > : DEFAULT }
<FREE> TOKEN { <OTHER : ~["}"] > : FREE }
在解析器中,您可以擁有
void freeSection() : {} { <LBRACE> (<OTHER>)* <RBRACE> }
如果要對所有其他字符進行處理,請參閱FAQ中的問題5.2。 http://www.engr.mun.ca/~theo/JavaCC-FAQ
如果要在FREE狀態下捕獲變量引用,例如“ $ {i}”,也可以這樣做。 加
<FREE> TOKEN { <VARREF : "${" (["a"-"Z"]|["A"-"Z"])* "}" > }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.