2010-09-09 55 views
2

我使用COCOR以產生一個Java類掃描器/解析器代碼塊:
我有在創建EBNF表達一些麻煩匹配一個碼塊:解析與EBNF表達

我假設碼塊由兩個公知的標記所包圍: < &和&> 例如:

public method(int a, int b) <& 
various code 
&> 

如果我定義的非終結符號

codeblock = "<&" {ANY} "&>" 

如果兩個符號中的代碼包含'<'字符,則生成的編譯器將無法處理它,從而導致語法錯誤。

任何提示?

編輯:

COMPILER JavaLike 
CHARACTERS 

nonZeroDigit = "123456789". 
digit   = '0' + nonZeroDigit . 
letter  = 'A' .. 'Z' + 'a' .. 'z' + '_' + '$'. 

TOKENS 
ident = letter { letter | digit }. 

PRODUCTIONS 
JavaLike = {ClassDeclaration}. 
ClassDeclaration ="class" ident ["extends" ident] "{" {VarDeclaration} {MethodDeclaration }"}" . 
MethodDeclaration ="public" Type ident "("ParamList")" CodeBlock. 
Codeblock = "<&" {ANY} "&>". 

我已經省略了簡單起見一些生產。
這是我實際執行的語法。主要的錯誤是,如果塊中的代碼包含符號'>'或'&'中的一個,它將失敗。

回答

0

您可以擴展任意項以包含<&,&>和另一個非終結符(稱爲ANY_WITHIN_BLOCK)。

然後你只需要使用

ANY = "<&" | {ANY_WITHIN_BLOCK} | "&>" 
codeblock = "<&" {ANY_WITHIN_BLOCK} "&>" 

然後的{ANY}是不變的,如果你真的需要它後面的含義。

好吧,我對CocoR一無所知,並且給了你一個無用的答案,所以讓我們再試一次。

正如我在後面的評論中說的那樣,我認爲真正的問題是你的語法可能太鬆散並且沒有充分指定。當我爲我嘗試創建的一種語言編寫CFG時,我最終使用了一種「中間相遇」方法:我寫了頂層結構和直接低層結構,首先是令牌的高級組合,然後努力使它們在中等級別相遇(大約在條件和控制流程的水平,我猜)。

你說這個語言有點像Java,所以讓我給你看第一行,作爲初稿來描述它的語法(用僞代碼,對不起,其實它就像yacc/bison一樣,在這裏,我使用你的支架,而不是Java的):

/* High-level stuff */ 

program: classes 

classes: main-class inner-classes 

inner-classes: inner-classes inner-class 
      | /* empty */ 

main-class: class-modifier "class" identifier class-block 

inner-class: "class" identifier class-block 

class-block: "<&" class-decls "&>" 

class-decls: field-decl 
      | method 

method: method-signature method-block 

method-block: "<&" statements "&>" 

statements: statements statement 
      | /* empty */ 

class-modifier: "public" 
       | "private" 

identifier: /* well, you know */ 

而在爲你做的一切,同時,找出你的眼前令牌組合,例如像定義「數字」爲float或int和然後創建添加/減去/等的規則。他們。

我不知道你的方法到目前爲止,但你一定要確保你仔細地指定一切,並在你想要一個特定的結構時使用新的規則。不要因爲制定一對一的規則而變得荒謬,但如果能幫助你更好地組織你的想法,就不要害怕創建新的規則。

+0

如何定義ANY_WITHIN_BLOCK? – nick2k3 2010-09-09 14:31:15

+0

你如何定義任何? – 2010-09-09 14:31:31

+0

ANY是CocoR中的「快活」標記:它匹配每個標記。 – nick2k3 2010-09-09 14:34:11

1

尼克,尾盤在這裏聚會......

許多方法可以做到這一點:

定義令牌<&&>讓詞法分析器知道它們。

您可以使用評論指令

評論來自<& TO &> - 引述李玟期待。

或在您的scanner.frame文件中製作hack NextToken()。做這樣的事情(僞代碼):

if (Peek() == CODE_START) 
{ 
    while (NextToken() != CODE_END) 
    { 
     // eat tokens 
    } 
} 

或者可以覆蓋在緩衝區中的Read()方法,並在最低水平吃。

HTH