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