2015-08-09 31 views
1

我試圖創建一個開始的行令牌「‘getCharPositionInLine’的名稱在當前環境中不存在」發出錯誤如何檢測線的開頭,或:</p> <pre><code>lexer grammar ScriptLexer; BOL : {getCharPositionInLine() == 0;}; // Beginning Of Line token </code></pre> <p>但上面的:

The name 'getCharPositionInLine' does not exist in the current context 

因爲它創建這樣的代碼:

private void BOL_action(RuleContext _localctx, int actionIndex) { 
    switch (actionIndex) { 
    case 0: getCharPositionInLine() == 0; break; 
    } 
} 

getCharPositionInLine()方法d不存在...

+0

也許嘗試'GetCharPositionInLine()'(PascalCase按照各種C#代碼指南推薦) – knittl

+0

@knittl,試過了。沒有方法的名稱甚至類似於... – Tar

+0

查看詞法分類:https://github.com/antlr/antlr4-csharp/blob/master/runtime/CSharp/Antlr4.Runtime/Lexer .cs裏面有一個'charPositionInLine',但我不太熟悉C#發佈一個答案(因此這個評論)。 –

回答

3

最簡單的方法是將EOL識別爲相應的BOL令牌。

BC : '/*' .*? '*/' -> channel(HIDDEN) ; 
LC : '//' ~[\r\n]* -> channel(HIDDEN) ; 
HWS : [ \t]*  -> channel(HIDDEN) ; 
BOL : [\r\n\f]+ ; 

像塊註釋規則這樣的規則會在內部使用EOL,所以在那裏沒有問題。像行註釋這樣的規則不會消耗EOL,因此緊接着的行會發出適當的BOL。

潛在的問題是在輸入開始時不會發射BOL。處理這個問題最簡單的方法是在將輸入文本輸入到詞法分析器之前用線路終端強制輸入文本的前綴。

+0

優秀的答案,它幫助了我一個類似的問題(我通過https://stackoverflow.com/q/32870858/1112244來到這裏)。我會補充一點,如果你不把'BOL'路由到一個隱藏的頻道,你將不得不將它包含在你期望遇到這些字符的任何地方。在我的情況下,我使用了一個單獨的詞法分析器和分析器,並且在詞法分析器中定義了必須出現在行首(它是行標籤)的標記。我的解析器規則不是以EOL分隔的,因此我將'BOL'路由到隱藏通道,以避免將其添加爲解析器規則。 – Peter

相關問題