簡體   English   中英

javaCC中的無語法部分

[英]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.

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