簡體   English   中英

用EBNF表達式解析代碼塊

[英]Parsing a code block with EBNF expression

我正在使用CocoR生成類似Java的掃描器/解析器:
我在創建與代碼塊匹配的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} "&>".

為了簡單起見,我省略了一些作品。
這是我對語法的實際實現。 主要的錯誤是,如果塊中的代碼包含符號“>”或“&”之一,它將失敗。

尼克,晚到這里來...

有很多方法可以做到這一點:

<&&>定義標記,以便詞法分析器了解它們。

您可能可以使用COMMENTS指令

來自<& TO &>評論-引用CoCo的預期。

或在您的scanner.frame文件中使用hack NextToken()。 做這樣的事情(偽代碼):

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

或者可以重寫Buffer中的Read()方法並以最低級別進食。

HTH

您可以將ANY術語擴展為包括<&&>和另一個非終結符(稱其為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 */ 

並且在執行所有操作的同時,找出您的直接令牌組合,例如將“數字”定義為浮點數或整數,然后創建用於加/減/等的規則。 他們。

我不知道到目前為止您的方法是什么,但是您絕對要確保自己仔細指定所有內容,並在需要特定結構時使用新規則。 創建一對一規則不要太可笑,但是如果可以幫助您更好地組織思想,就不要害怕創建新規則。

暫無
暫無

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

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